如何在python中将命令的输出传递给`/ dev / null`

时间:2014-12-03 13:51:51

标签: python bash stderr

我正在尝试将以下命令的输出传递给/dev/null,以便它不会为正在运行该程序的用户打印。

import os
os.system("ping -c 1 192.168.unknown.host > /dev/null")

但我收到错误:

ping: unknown host  192.168.unknown.host

问题是此消息是由stdout之外的其他内容生成的,可能是stderr,我可以使用

轻松地将其重定向到/dev/null
ping -c 1 192.168.unknown.host >& /dev/null

但是,当我在python中使用它时,我收到以下错误:

sh: 1: Syntax error: Bad fd number

有可能解决这个问题吗? (我只是不想要打印这条消息)。

2 个答案:

答案 0 :(得分:7)

import subprocess

subprocess.Popen(
    ['ping', "-c", "192.168.unknown.host"],
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL,
)

Ashwini Chaudhary指出,对于3.3以下的Python,您必须手动打开os.devnull

import os
import subprocess

with open(os.devnull, 'w') as DEVNULL:
    subprocess.Popen(
        ['ping', "-c", "192.168.unknown.host"],
        stdout=DEVNULL,
        stderr=DEVNULL,
    )

答案 1 :(得分:2)

您应该查看Python subprocess模块。它提供了几种可以处理标准输入,输出和错误的方法。

这样的事情:

import subprocess as sub
import shlex

cmd = "ping -c 1 myhost"
cmdarg = shlex.split(cmd)
p = sub.Popen(cmdarg,stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()