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

40 投票
4 回答
66363 浏览
提问于 2025-04-16 11:49

在Python中,怎么用最简单和标准的方式通过subprocess来执行一个命令,而不想处理它的输出呢?

我试过用subprocess.call,但是它似乎会返回输出。我并不想要这些输出,我只是想静静地运行这个程序,不想让输出弄得屏幕乱七八糟。

如果有帮助的话,我是想调用pdflatex,我的目的就是单纯地执行它。

4 个回答

3

只需要像平常一样调用它,然后在命令的末尾加上 >/dev/null。这样做会把任何文本输出都重定向到一个空地方。

61

如果你的程序产生了大量的输出,而你又不想把这些输出存储在内存中,那么你可以把这些输出发送到一个“电子垃圾桶”里:

subprocess.run(["pdflatex", filename], stdout=subprocess.DEVNULL)

这里的特殊值 DEVNULL 表示输出会被发送到你操作系统的相应的空设备上(在大多数操作系统上是 /dev/null,而在其他一些系统上是 nul)。

43
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 输出的内容(包括正常输出和错误输出)放到内存中的缓冲区里,这些缓冲区是由 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

编辑-2: 对于 subprocess.call 的一个注意事项:

注意:不要在这个函数中使用 stdout=PIPE 或 stderr=PIPE。因为在当前进程中没有读取这些管道,如果子进程产生的输出足够多,可能会填满操作系统的管道缓冲区,从而导致子进程被阻塞。

撰写回答