bash脚本的Python subprocess.check_调用没有等待子进程完成 N=50000 以open('input','w')作为f: 对于范围(N)中的i: f、 写入(str(i)+'\n') 运行命令='/bin/bash-e-o pipefail-c'(sort | tee>/dev/null>(cat |(tee>/dev/null>(sort>&3)))输出)并等待“' 子进程检查调用(运行命令,shell=True) 时间。睡眠(睡眠时间) 打印sh.wc(“输出”、“-l”)
使用bash脚本的Python subprocess.check_调用没有等待子进程完成 N=50000 以open('input','w')作为f: 对于范围(N)中的i: f、 写入(str(i)+'\n') 运行命令='/bin/bash-e-o pipefail-c'(sort | tee>/dev/null>(cat |(tee>/dev/null>(sort>&3)))输出)并等待“' 子进程检查调用(运行命令,shell=True) 时间。睡眠(睡眠时间) 打印sh.wc(“输出”、“-l”),python,bash,subprocess,Python,Bash,Subprocess,使用sleep\u time=0运行这段python代码返回0,但使用sleep\u time=1返回50000 原因似乎在于没有等待bash子进程完成。我使用的wait函数可能不正确。我做了实验,但没有找到令人满意的解决办法 当您/bin/bash时,您的命令将在子shell中运行,因此您将立即退出该进程。您在该子shell中运行的命令也在后台运行,因为最后有&,您可以传递$作为的参数等待直到最后一个后台进程退出。不确定它是否会直接帮助您解决问题,但您应该能够通过不运行shell=True或使
sleep\u time=0
运行这段python代码返回0,但使用sleep\u time=1
返回50000
原因似乎在于没有等待bash子进程完成。我使用的
wait
函数可能不正确。我做了实验,但没有找到令人满意的解决办法 当您/bin/bash
时,您的命令将在子shell中运行,因此您将立即退出该进程。您在该子shell中运行的命令也在后台运行,因为最后有&
,您可以传递$
作为的参数等待
直到最后一个后台进程退出。不确定它是否会直接帮助您解决问题,但您应该能够通过不运行shell=True
或使用executable='/bin/bash'
运行来降低此操作的复杂性。现在,您启动sh
只是为了转过身来启动bash
,而从来没有实际使用sh
shell做任何事情。实验提示,bash不会等待通过括号运行的子shell。据我所知,子shell作业对父进程不可见,因此没有标准命令等待它们。您是否考虑过在本机Python中尝试这样做,而不是生成shell命令?这样可能更容易处理……有几件事我没有从你的代码中得到:你为什么要在一个打开阅读的文件中写作?什么是sh.wc
?你的bash脚本在做什么?子进程。check_调用(…)是启动进程并等待其完成执行。存在打印错误。文件“输入”应以“w”模式打开。sh是python sh库中的一个模块,它在大多数shell命令上实现包装器,因此sh.wc是shellwc
命令的一个类似物。subprocess.check_调用等待shell命令完成,但不等待其子进程完成。
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")