我运行java程序作为子进程但是当我将stderr重定向到管道时,程序挂起。例如,myProcess = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE)
有效,但myProcess = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE, stderr=subprocess.PIPE)
会挂起。
我运行的命令类似于:
java -DSomeVals -classpath <somevals> package.Name
Stderr会产生大量的输出,我记得在某处使用shell = True可能会导致死锁。不幸的是,当我设置shell = False时,我收到一条错误消息,指出文件名太长了。
我尝试了myProcess = subprocess.Popen(['java', args], shell=False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
,但后来java抱怨它无法找到我试图运行的课程。
我想管道stderr,因为它使我的程序输出变得混乱。
答案 0 :(得分:1)
我认为你只需要从管道中读取。管道缓冲区正在填满并阻止该过程。查看这个重复&#34; HelloWorld&#34; 50,000次。
import subprocess
import os
def getLinesFromShellCommand(command):
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=os.getcwd())
lines = []
for curLine in p.stdout.readlines():
lines.append(curLine)
p.wait()
return lines
print "Starting..."
lines = getLinesFromShellCommand("printf 'HelloWorld\n%.0s' {1..50000}")
for curLine in lines:
print curLine,