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()