python子进程隐藏标准输出并等待它完成

python子进程隐藏标准输出并等待它完成,python,synchronization,subprocess,stdout,Python,Synchronization,Subprocess,Stdout,我有以下代码: def method_a(self): command_line = 'somtoolbox GrowingSOM ' + som_prop_path subprocess.Popen(shlex.split(command_line)) ...... def method_b(self): ..... .... 正如大家所看到的,方法_a有一个子进程调用somtoolbox程序。但是这个程序有一个很长的stdout,我想把它隐藏起来。我试过: sub

我有以下代码:

def method_a(self):
    command_line = 'somtoolbox GrowingSOM ' + som_prop_path
    subprocess.Popen(shlex.split(command_line))
    ......

def method_b(self): .....
....
正如大家所看到的,方法_a有一个子进程调用somtoolbox程序。但是这个程序有一个很长的stdout,我想把它隐藏起来。我试过:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE)
但它返回了这句话:

cat: record error: Broked Pipe   
(这是葡萄牙语句子的翻译:“猫:埃罗·德·格拉瓦ção:Pipe quebrado”) (我来自巴西)

另外,我还有其他方法(比如这里的方法_b),它们在方法_a之后调用,并且在子流程完成流程之前运行这些方法

我如何隐藏标准输出(并且不希望它出现在任何地方),并让其他代码等待子进程完成执行

Obs:somtoolbox是一个java程序,它向终端提供长输出。 尝试:

但是不断地将输出返回到shell。 救命啊

用于等待进程终止。例如:

from subprocess import PIPE, Popen
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate()

将返回一个字符串元组,一个用于stdout,另一个用于stderr输出。

最好的方法是将输出重定向到/dev/null。您可以这样做:

devnull = open('/dev/null', 'w')
subprocess.Popen(shlex.split(command_line), stdout=devnull)
然后,要等待操作完成,可以对Popen对象使用.wait(),从而实现以下目的:

devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull)
retcode = process.wait()
retcode随后将包含流程的返回代码

附加:如评论中所述,这不会隐藏stderr。要同时隐藏stderr,您可以这样做:

devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull)
retcode = process.wait()

它不起作用。看看我的最后一句话,看看它是否改变了什么。这是一个java程序的输出…请看这里。@Gabriel也许你也需要重定向stderr?如果你用os.devnull替换“/dev/null”(自2.4以来就存在,与子进程本身一样),它也可以在Windows上工作。请注意,你可以在Python 3.3+中使用
subprocess.devnull
而不是
open('/dev/null',')
devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull)
retcode = process.wait()