【问题标题】:How to force wait() to completely wait for subprocess? wait() can not work如何强制 wait() 完全等待子进程?等待()无法工作
【发布时间】:2013-09-28 16:27:07
【问题描述】:

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

【问题讨论】:

  • 您还没有真正告诉我们运行此代码时出了什么问题。 它没有工作并不是一个错误信息。

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


【解决方案1】:

你的代码有几个问题,它没有运行并不奇怪。

使用subprocess.call() 时,您不必致电.wait()。该函数负责处理Process.wait() 调用为您

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

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

强调我的。

此外,您的 ant_debug() 函数不会返回任何内容(更不用说要运行的命令了)。相反,它使用os.system() 运行ant 命令!删除那个调用一起。使用subprocess.call() 代替 os.system()

重写您的代码以使用 just 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 shell 关闭。 cmd的返回值不一定和ant返回的一样。

【讨论】:

    【解决方案2】:

    除了 Martijn 在 subprocess.call 上的 cmets 之外,“cmd /k”表示运行命令然后继续 - 所以在你告诉 cmd 退出之前它不会终止。一开始可能不需要使用 cmd 运行 ant 命令,因此只需从调用列表中删除前两项即可。如果您确实打算通过 cmd 等 shell 运行命令,则可以传递参数 shell=True(但要先了解为什么,这是有风险的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多