我有这段代码:
def method_a(self):
command_line = 'somtoolbox GrowingSOM ' + som_prop_path
subprocess.Popen(shlex.split(command_line))
......
def method_b(self): .....
....
并且像你们都看到的那样,method_a有一个调用somtoolbox程序的子进程。但是这个程序有很长的标准,我想隐藏它。我试过了:
subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE)
但它返回了这句话:
cat: record error: Broked Pipe
(这是葡萄牙语句子的翻译:“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()
但是连续返回shell的输出。 救命啊!
答案 0 :(得分:18)
最好的方法是将输出重定向到/ 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()
答案 1 :(得分:5)
Popen.communicate
用于等待进程终止。例如:
from subprocess import PIPE, Popen
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate()
将返回一个字符串元组,一个用于stdout,另一个用于stderr输出。