2012-12-07 78 views
2
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返回0,这条巨蟒的代码,但sleep_time = 1返回50000Python的subprocess.check_call不等待子进程结束

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

+0

不确定它会直接帮助你解决问题,但是你应该能够通过运行而不是'shell = True'或者运行'executable ='/ bin/bash''来降低这个操作的复杂性。现在,你启动'sh'只是为了转身并启动'bash',而不用真正使用'sh'外壳。 –

+0

由括号运行的子查询中的实验提示不等于bash。据我所知,subshel​​l作业对父进程不可见,所以没有标准命令来等待它们。 –

+0

您是否考虑过尝试在本地Python中执行此操作,而不是生成shell命令?可能更容易处理这种方式... –

回答

1

当您的/bin/bash您的命令将在子shell中运行,因此您立即退出该过程。此外,由于最终的&,您在该子shell中运行的命令在后台运行,因此可以将$!作为参数传递给wait,直到等待,直到最后一个后台进程退出。