【问题标题】:How to pipe the output of a command to `/dev/null` in python如何在python中将命令的输出通过管道传输到`/dev/null`
【发布时间】:2014-12-03 13:51:50
【问题描述】:

我正在尝试将以下命令的输出通过管道传输到 /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

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

【问题讨论】:

  • &> 而不是>&。或者这只是一个错字?这仅适用于 bash 4,IIRC。否则使用> /dev/null 2>&1
  • 这不是一种类型,该命令在 shell 中有效,但在 python 中无效(无论哪种情况);但你的建议效果很好。
  • os.system 正在使用不支持>& 重定向的/bin/sh。在 shell 中尝试/bin/sh -c '<your command>',它也会失败。
  • 它在终端中工作,但python返回那个奇怪的错误。

标签: python bash stderr


【解决方案1】:
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,
    )

【讨论】:

  • 请注意,subprocess.DEVNULL 仅适用于 Python 3.3+,对于早期版本,您必须使用 open(os.devnull) 返回的对象。
【解决方案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()

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多