python subprocess在stderr重定向时挂起

2 投票
1 回答
1410 浏览
提问于 2025-04-29 18:46

我在运行一个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,

撰写回答