在Python中,通过subprocess
调用命令的最短和标准方法是什么,但不会打扰它的输出。
我尝试了subprocess.call
,但它似乎返回了输出。我并不为此烦恼,我只需要静默运行程序而不会使输出混乱。
如果有帮助,我正在调用pdflatex
,我的意图就是打电话给它。
答案 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。