【发布时间】: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,而实际上没有使用shshell 做任何事情。 -
实验提示用括号运行的子程序不会被 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