当stderr被管道传输时,python子进程挂起

时间:2014-10-26 18:21:16

标签: java python

我运行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,因为它使我的程序输出变得混乱。

1 个答案:

答案 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,