Java 当stderr通过管道传输时,python子进程挂起

Java 当stderr通过管道传输时,python子进程挂起,java,python,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 <someva

我将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
java-DSomeVals-classpath-package.Name
Stderr生成了大量的输出,我记得在某个地方读到,如果shell=True,可能会导致死锁。不幸的是,当我设置shell=False时,我收到一条错误消息,文件名太长

我尝试了
myProcess=subprocess.Popen(['java',args],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
,但是java抱怨它找不到我试图运行的类


我想用管道传输stderr,因为它会干扰我程序的输出。

我想你只需要从管道中读取。管道缓冲区正在填充并阻塞进程。检查此示例,该示例重复“HelloWorld”50000次

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,

之后如何处理来自管道的数据?大多数python文档都说要使用communicate,但是如果您不关心stderr的结果,那么就将其设置为类似于
stderr=open(“/dev/null”)
(实际上不要这样做,它会泄漏文件描述符),否则您需要使用类似于
communicate()的东西
从两个管道发出咕噜声,以防止输出触发死锁。我调用communicate,但只有在进程运行大约5分钟后(产生我需要的结果需要这么长的时间)。与此同时,应用程序每隔几秒钟就会写入一条日志消息。