2015-10-20 74 views
0

我有一個python應用程序,如果點擊某個特定的按鈕,應該運行一個bash腳本。我把應用程序放到菜單中,創建了.desktop文件,除了subprocess.call以外,一切看起來都很好。我還用os.system()和其他幾種解決方案嘗試了它,如果應用程序是從終端啓動的,它們都可以正常工作,但如果它是通過菜單圖標啓動的,則不會。有人知道怎麼修這個東西嗎?我希望它運行沒有終端窗口,從菜單上,但沒有找到類似於我的主題Python subprocess.call運行bash腳本如果從終端運行,但不從debian菜單運行

回答

0

這是因爲GUI過程從標準輸出/ stderr的分離,並重定向到登錄電子代替。請解釋你的bash腳本在做什麼,顯然,它是在沒有窗口的情況下運行的。要進行檢查,請將其寫入某個文件,然後您會看到該腳本已經運行。或者你提到你不喜歡你的進程有一個控制檯窗口,但你的bash腳本應該在一個運行。

如果是這樣,請先調用subprocess.call()調用終端,然後用命令調用bash腳本。

請更精確地解釋清楚您需要什麼,以便我們可以幫助您。

如果你確實需要啓動一個終端,我爲你編寫了一些代碼。

在Linux上啓動新終端的問題是存在許多不同的桌面環境。

他們每個人通常都是自己的終端程序。

要使用哪一個?你可能只是嘗試,直到你成功:

import subprocess 
script = "~/full_path_to_your_bash_script.sh" 
# Uncomment following line to ensure execution by bash and remove potential problems with permissions. 
#script = "bash "+script 
# Commands to call (add some more if you remember any): 
commands = [ 
    ['gnome-terminal', '-x', script], 
    # xterm is usually present: 
    ['xterm', '-e', script], 
    ['rxvt', '-e', script] 
    ] 
ok = 0 
for command in commands: 
    try: 
     subprocess.call(command) 
     ok = 1; break 
    except OSError, e: 
     if e.errno==2: continue # No such file or directory - skip non-existing terminal and try another 
     raise # Some other OSError occurred 
    except: raise 
if not ok: raise RuntimeError, "No terminal available!" 
+0

謝謝,這看起來不錯,我會嘗試它。我的腳本運行一些終端命令轉換和編輯圖像,然後將其發送到打印機。 ,我知道如果我從菜單運行應用程序,我錯過了該腳本的終端,但我不知道如何在運行時獲得應用程序。 –

+0

如果這些命令沒有使用stdout/stderr來表示沒有具體內容,而是一些內容豐富的文本,並且它們不使用stdin中的任何內容,那麼在沒有終端/控制檯的情況下運行腳本應該可以工作。 – Dalen

+0

@ kov%c3%a1cs-gabika-ella:我編輯了我的A.並添加了一些可能有用的代碼。 – Dalen

0

嘗試添加shell = True在調用語句中。 subprocess doc

subprocess.call("exit 1", shell=True) 
+0

我不確定這會有所幫助。 shell = True意味着該命令將首先通過shell進行處理,並且該shell將其傳遞給OS。如果沒有使用假殼。命令直接傳遞給操作系統。雖然shell = True可能會迫使shell啓動,但我認爲這不會有幫助。 – Dalen

+0

我也試過,沒有工作:( –

1

好了,兩個答案的工作,因爲這個問題是不缺少的終端,但我知道。

我在我的應用程序,它最初是爲了調用腳本執行留下了代碼會話,但它是從另一個部分調用,所以相對路徑

subprocess.call('./script') 

有固定

subprocess.call('absolute_path_to_script') 
  • 這使它立即。我也嘗試改變到絕對路徑,但按鈕從未調用該事件,所以...我的錯誤,感謝您的時間來嘗試幫助我
+0

我Upvoted你只是爲了承認你的錯誤。通過代碼會話,你是否意味着從GUI啓動時工作目錄發生了變化。這個是正常的。如果你之前發佈了回溯,我們可能已經告訴過你發生了什麼。在詢問SO時請記住這一點。始終發佈嘗試和結果。很高興您的應用有效 – Dalen

+0

我的意思是我一遍又一遍地改變了幾個小時的代碼甚至沒有執行,因爲沒有任何調用它。在某個時間(幾個月前),我最終改變了主意,並將subprocess.call放到了另一個函數中,並且該函數由button_click事件調用,該函數從未改變過。所以我試圖修復我的代碼,沒有影響代碼執行。 :(但我學到了我的課:) –

+0

Woops,這是在行動討厭。 – Dalen