python subprocess在stderr重定向时挂起
我在运行一个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
错误输出会产生大量的信息,我记得在哪里看到过,当使用shell=True时,这可能会导致死锁。可惜的是,当我把shell设置为False时,出现了文件名太长的错误信息。
我尝试了 myProcess = subprocess.Popen(['java', args], shell=False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
,但Java却抱怨找不到我想要运行的类。
我想重定向错误输出,因为它让我的程序输出变得很杂乱。
1 个回答
2
我觉得你只需要从管道中读取数据。现在管道的缓冲区快满了,这导致进程被阻塞了。看看这个例子,它会把“HelloWorld”重复打印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,