Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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是shell
wc
命令的一个类似物。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")