如何强制wait()完全等待子进程? wait()无法正常工作

时间:2013-09-28 16:27:08

标签: python python-3.x subprocess wait popen

我想通过popen(python)处理command1,然后在第一个命令完成时运行另一个command2。当我使用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 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,并且它不会运行并不令人惊讶。

使用.wait()时,您无需致电subprocess.call()。该功能负责为您Process.wait()调用

相反,subprocess.call()直接返回退出代码 。引用subprocess.call() documentation

  

运行 args 描述的命令。 等待命令完成,然后返回returncode属性。

强调我的。

此外,您的ant_debug()函数不返回任何内容(更不用说运行命令)。相反,它使用ant运行os.system()命令!一起删除该呼叫 。使用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 ;这里不需要shell。 /k开关甚至阻止 cmd shell关闭。 cmd的返回值不一定与ant返回的值相同。

答案 1 :(得分:0)

除了Martijn对subprocess.call的评论之外,“cmd / k”表示运行命令然后继续 - 所以在你告诉cmd退出之前这不会终止。可能不需要首先使用cmd运行ant命令,因此只需从调用列表中删除前两项。如果您的意思是通过诸如cmd之类的shell运行命令,则可以传递参数shell=True(但首先要学习为什么,存在风险)。