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

use*_*312 35 python subprocess

在Python中,调用命令subprocess但不打扰其输出的最短和标准方法是什么.

我尝试过subprocess.call它似乎返回输出.我并不担心,我只需要静默运行程序而不会使输出混乱.

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

Sve*_*ach 51

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

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

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


San*_*nta 38

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

基本上,这"管道" 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
Run Code Online (Sandbox Code Playgroud)

编辑-2:注意subprocess.call:

注意:不要在此函数中使用stdout = PIPE或stderr = PIPE.由于在当前进程中没有读取管道,子进程可能会阻塞它是否为管道生成足够的输出以填充OS管道缓冲区.

  • @Dana:`subprocess.call()`阻塞,直到进程完成.如果缓冲区在此期间变满,它将死锁,并且紧接在调用之后的代码将永远不会被执行.使用`stdout = PIPE`和`subprocess.call()`是错误的.如果您对输出感兴趣,请使用`subprocess.check_output()`.如果要使输出静音,请使用`with open(os.devnull,"w")作为f:subprocess.call("your_subprocess",stdout = f)`. (10认同)
  • 你不应该在`subprocess.call()`中使用`stdout = subprocess.PIPE`.没有人从管道读取,所以一旦缓冲区满了就会死锁. (3认同)