python子进程隐藏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): .....
....

正如你们所见,method_a 有一个调用 somtoolbox 程序的子进程。但是这个程序有一个很长的标准输出,我想隐藏它。我试过:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE)

但是它返回了这句话:

cat: record error: Broked Pipe   

(这是葡萄牙语句子的翻译:“cat: erro de gravação: Pipe quebrado”) (我来自巴西)

此外,我还有其他方法(如那里的 method_b),它们在 method_a 之后调用,并且 tis 方法在子进程完成进程之前运行。

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

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

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate()

但持续向 shell 返回输出。 帮助!

最佳答案

最好的方法是将输出重定向到/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()

关于python子进程隐藏stdout并等待它完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125525/

相关文章:

Python - 隐藏/最小化子进程窗口

python - 使用 Moviepy 获取剪辑中的帧数

c++ - 同步非常快的线程

linux - 单向同步并跳过 Linux 中的特定文件夹

python - web.py + 子进程 = 挂起

使用 Pyinstaller 的 Python 子进程 Popen

python - 无法建立新连接最大重试错误

python - 如何将矩阵从 excel 导入 numpy,然后绘制它?

iphone - 多人游戏同步

python - 使用 python 运行 jar 并传递输入/输出