python子进程隐藏stdout并等待它完成

Gab*_*ira 5 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): .....
....
Run Code Online (Sandbox Code Playgroud)

就像你们都看到的那样,method_a有一个调用somtoolbox程序的子进程.但是这个程序有很长的标准,我想隐藏它.我试过了:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

但它返回了这句话:

cat: record error: Broked Pipe   
Run Code Online (Sandbox Code Playgroud)

(这是葡萄牙语句子的翻译:"cat:errodegravação:Pipe quebrado")(我来自巴西)

另外,我有其他方法(比如method_b),在method_a之后调用,并且tis方法在子进程完成进程之前运行.

我怎么能隐藏stdout(并且不想在任何地方),并让其他代码等待子进程完成执行?

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

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

但连续返回到shell的输出.救命!

Ben*_*nno 18

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

devnull = open('/dev/null', 'w')
subprocess.Popen(shlex.split(command_line), stdout=devnull)
Run Code Online (Sandbox Code Playgroud)

然后等到它完成后,你可以在Popen对象上使用.wait(),让你这样:

devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull)
retcode = process.wait()
Run Code Online (Sandbox Code Playgroud)

然后,retcode将包含进程的返回码.

附加:正如评论中所提到的,这不会隐藏stderr.要隐藏stderr,你也会这样做:

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


And*_*Dog 5

Popen.communicate用于等待进程终止.例如:

from subprocess import PIPE, Popen
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

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

  • 只需添加`,stderr = PIPE`. (2认同)