2014-10-26 30 views
1

我运行一个java程序作为子进程,但是当我将stderr重定向到管道时,程序挂起。例如myProcess = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE)工程,但myProcess = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE, stderr=subprocess.PIPE)挂起。当stderr被传送时,python子进程挂起

我运行的命令是沿着线的东西:

java -DSomeVals -classpath <somevals> package.Name 

标准错误输出产生大量的,我记得读书的地方,有壳=真可能会导致死锁。不幸的是,当我设置shell = False时,我得到一个错误消息,文件名太长。

我试过myProcess = subprocess.Popen(['java', args], shell=False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)但是后来java抱怨说它找不到我想要运行的类。

我想管道stderr,因为它混乱我的程序的输出。

+0

你以后如何处理来自管道的数据?大部分的python文档都说要使用通信,但是如果你不关心stderr的内容,那么可以像stderr = open(“/ dev/null”)这样那么它会泄露文件描述符),否则你需要使用'communicate()'这样的东西来缓冲两个管道,以防止输出触发死锁。 – Petesh 2014-10-26 18:30:53

+0

我打电话沟通,但只有在该过程已运行约5分钟后(需要很长时间才能生成我需要的结果)。与此同时,应用程序每隔几秒就会写一条日志消息。 – ventsyv 2014-10-26 22:30:57

回答

1

我想你只需要从管道读取。管道缓冲区填满并阻止进程。检出这个重复“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, 
相关问题