如何调用命令而不是获取其输出

时间:2011-02-14 20:22:08

标签: python subprocess

在Python中,通过subprocess调用命令的最短和标准方法是什么,但不会打扰它的输出。

我尝试了subprocess.call,但它似乎返回了输出。我并不为此烦恼,我只需要静默运行程序而不会使输出混乱。

如果有帮助,我正在调用pdflatex,我的意图就是打电话给它。

4 个答案:

答案 0 :(得分:51)

如果您的进程产生大量输出而您不想在内存中缓冲,则应将输出重定向到电子垃圾箱:

with open(os.devnull, "w") as f:
    subprocess.call(["pdflatex", filename], stdout=f)

变量os.devnull是操作系统的空设备的名称(大多数操作系统上为/dev/null,另一个上为nul)。

答案 1 :(得分:36)

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# do something with out, err, or don't bother altogether.

基本上,这会将cmd输出到stdout和stderr的任何输出“管道”到由subprocess准备的内存缓冲区。你对这些缓冲区的内容做了什么取决于你。你可以检查它们,或者完全不打扰它们。但是管道对这些缓冲区的副作用是它们不会被打印到终端上。

编辑:这也适用于便捷方法call。为了演示:

>>> subprocess.call('ping 127.0.0.1')

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
0
>>> subprocess.call('ping 127.0.0.1', stdout=subprocess.PIPE)
0

edit-2 subprocess.call的注意事项:

  

注意:请勿对此函数使用stdout = PIPE或stderr = PIPE。作为   在当前进程中没有读取管道,子进程可能   阻止它是否为管道生成足够的输出以填充OS管道   缓冲液中。

答案 2 :(得分:3)

只需按原样调用它,并在comamnd结尾处添加&gt; / dev / null。这将重定向任何文本输出。

答案 3 :(得分:3)

如果您使用的是Unix,请使用/ dev / null。如果在Shell中运行任何命令,并且不想在终端上显示其输出。

例如: - ls&gt; / dev / null不会在终端上产生任何输出。

所以只需使用os,subprocess在shell上执行一些操作,然后将其o / p放入/ dev / null。