Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Python 将管道与subprocess.Popen一起使用_Python_Subprocess - Fatal编程技术网

Python 将管道与subprocess.Popen一起使用

Python 将管道与subprocess.Popen一起使用,python,subprocess,Python,Subprocess,我希望通过管道将一个命令的输出传输到另一个命令。命令2必须在命令1执行完成后运行,依此类推。我尝试使用“subprocess.Popen()”的“wait”。但不知何故,它不起作用 有人能帮我吗 使用的代码: proc= subprocess.Popen(['python27','scriptA.py',file],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE, stderr=subprocess.STDOUT) proc.wait() sor

我希望通过管道将一个命令的输出传输到另一个命令。命令2必须在命令1执行完成后运行,依此类推。我尝试使用“subprocess.Popen()”的“wait”。但不知何故,它不起作用

有人能帮我吗

使用的代码:

proc= subprocess.Popen(['python27','scriptA.py',file],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
proc.wait()
sortedop= subprocess.Popen(['sort'],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE,stdin=proc.stdout, stderr=subprocess.STDOUT)
sortedop.wait()
countReducer= subprocess.Popen(['python27', 'scriptB.py'],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE,stdin=sortedop.stdout, stderr=subprocess.STDOUT)
countReducer.wait()
fd = open(file+".json", 'w')
countpostprocesser= subprocess.Popen(['python27', 'scriptC.py'],cwd="C:\pythonPrograms\\",stdout=fd,stdin=countReducer.stdout,stderr=subprocess.STDOUT,shell=True)
countpostprocesser.wait()
fd.close()

如果确实希望在下一个脚本启动之前完成一个脚本,并且输出数据不太大,则可以将数据读入内存:

proc= subprocess.Popen(['python27','scriptA.py',file],cwd="C:\\pythonPrograms\\",stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
sortedop= subprocess.Popen(['sort'],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE,stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = sortedop.communicate(out)
countReducer= subprocess.Popen(['python27', 'scriptB.py'],cwd="C:\pythonPrograms\\",stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = countReducer.communicate(out)
fd = open(file+".json", 'w')
countpostprocesser= subprocess.Popen(['python27', 'scriptC.py'],cwd="C:\pythonPrograms\\",stdout=fd, stderr=subprocess.STDOUT)
out, err = countpostprocesser.communicate(out)

到底是什么不起作用?我想将“Script.py”的输出提供给“sort”命令,但只有在scriptA.py完成执行之后。为此,我使用了*.wait(),但这不起作用。我仍然不确定您所说的是否起作用。
script.py
的输出是否没有进行
sort
,或者它将在
script.py
完成之前进行
sort
?它不返回
Popen
对象,只返回它运行的进程的退出代码。因此,您可能会在调用
proc.wait()
时失败,因为
proc
将是一个
int
。如果管道缓冲区已满,执行的程序将阻塞,直到它可以再次写入缓冲区。如果您不从管道读取数据,而是调用
wait
则会出现死锁。我尝试使用上述代码。但令人惊讶的是,“sortedop”并没有获取“proc”的输出。但是我可以打印“proc”的输出。@codelearner-可能是我的错。。。我对sortedop使用了错误的stdin(它应该是subprocess.PIPE)。我已经编辑好了。