如何仅调用命令而不获取输出
在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。因为在当前进程中没有读取这些管道,如果子进程产生的输出足够多,可能会填满操作系统的管道缓冲区,从而导致子进程被阻塞。