2013-09-28 60 views
-1

我想通過popen(python)處理command1,然後在第一個命令完成時運行另一個命令2。當我使用wait()使其工作,但它沒有工作。爲什麼?有人可以幫助我嗎?如何強制wait()完全等待子進程? wait()無法工作

def ant_debug(): 
    ant_debug_cmd = 'cmd /k ant debug' 
    os.system(ant_debug_cmd) 

def adb_install(): 
    apk_debug_path = walk_dir('.\\bin') 
    adb_install_cmd = 'cmd /k adb install -r ' + apk_debug_path 
    os.system(adb_install_cmd) 

child = subprocess.call(ant_debug()) 
if child.wait() == 0: 
    adb_install() 
+2

你真的沒有告訴我們,當你運行這段代碼什麼不順心。 *它沒有工作*沒有太多的錯誤信息。 –

回答

1

有幾個問題,你的代碼,它是沒有驚喜也不會運行。

使用subprocess.call()時,不必調用.wait()。該功能負責Process.wait()致電爲您

而是,subprocess.call()直接返回退出代碼。引述subprocess.call() documentation:由ARGS描述

執行命令。 等待命令完成,然後返回returncode屬性。

重點煤礦。

此外,您ant_debug()功能不返回任何東西(更何況是一個命令來運行)。相反,它使用os.system()運行ant命令!刪除那個呼叫全部在一起。使用subprocess.call()os.system()代替

重寫代碼中使用只是subprocess.call()是:

retcode = subprocess.call(['ant', 'debug']) 

if retcode == 0: 
    apk_debug_path = walk_dir('.\\bin') 
    adb_install_cmd = ['adb', 'install', '-r', apk_debug_path] 
    subprocess.call(adb_install_cmd) 

,我們在命令傳遞到運行加上它作爲一個字符串列表參數。

我已經刪除了cmd /k前綴;只需運行ant直接;這裏不需要外殼。 /k開關甚至阻止外殼關閉。 cmd的返回值不一定與ant返回的值相同。

0

除了馬亭對subprocess.call評論,「cmd/K」是指運行一個命令然後繼續 - 所以這不會終止,直到你告訴CMD退出。可能不需要首先使用cmd運行ant命令,因此只需從呼叫列表中刪除前兩項。如果你的意思是通過外殼如CMD運行一個命令,你可以傳遞參數shell=True(但學會爲什麼第一,有風險)。