Skip to main content
 首页 » 编程设计

bash 脚本的 Python subprocess.check_call 不等待子进程完成

2025年05月04日13txw1958

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 函数的使用不正确。我做了实验,但没有找到令人满意的解决方案。

请您参考如下方法:

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