【问题标题】:Python subprocess.check_call of the bash script is not waiting for subprocesses to finishbash 脚本的 Python subprocess.check_call 不等待子进程完成
【发布时间】:2012-12-07 15:15:03
【问题描述】:
N = 50000
with open('input', 'w') as f:
    for i in range(N):
        f.write(str(i) + '\n')

run_command = '/bin/bash -e -o pipefail -c "((sort | tee >/dev/null >(cat | (tee >/dev/null >(sort >&3)))) <input 3>output)& wait"'

subprocess.check_call(run_command, shell=True)

time.sleep(sleep_time)

print sh.wc("output", "-l")

使用sleep_time = 0 运行这段python 代码返回0,但使用sleep_time = 1 返回50000。

原因似乎在于没有等待 bash 子进程完成。可能,我对wait 函数的使用不正确。我做了实验,但没有找到令人满意的解决方案。

【问题讨论】:

  • 不确定它是否会直接解决您的问题,但您应该能够通过不使用shell=True 运行或使用executable='/bin/bash' 运行来降低此操作的复杂性。现在,您启动 sh 只是为了转身启动 bash,而实际上没有使用 sh shell 做任何事情。
  • 实验提示用括号运行的子程序不会被 bash 等待。据我了解,子shell作业对父进程不可见,因此没有标准命令可以等待它们。
  • 您是否考虑过尝试在本机 Python 中执行此操作而不是生成 shell 命令?这样处理可能更容易......
  • 有几件事我没有从你的代码中得到:你为什么要在一个打开的文件f 中写入以供阅读? sh.wc 是什么?你的 bash 脚本在做什么? subprocess.check_call(...) 是启动你的进程并等待它完成它的执行
  • 印刷有误。文件“input”应该以“w”模式打开。 sh 是 python-sh 库中的一个模块,它实现了对大多数 shell 命令的包装,因此 sh.wc 是 shell wc 命令的类似物。 subprocess.check_call 等待 shell 命令完成,但不等待其子进程。

标签: python bash subprocess


【解决方案1】:

当您/bin/bash 您的命令将在子shell 中运行时,您将立即退出该进程。此外,您在该子 shell 中运行的命令也在后台运行,因为最后有 &amp;,您可以将 $! 作为参数传递给 wait 以便它 wait 直到最后一个后台进程退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多