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

Python 如何只调用命令而不获取其输出,python,subprocess,Python,Subprocess,在Python中,通过subprocess调用命令的最短和标准方法是什么,但不必考虑其输出 我尝试了subprocess.call,但它似乎返回了输出。我并不为此烦恼,我只需要安静地运行程序,而不会让输出在屏幕上乱七八糟 如果有帮助的话,我正在调用pdflatex,我的目的就是调用它 只需按原样调用它,并在comamnd末尾添加>/dev/null即可。这将重定向任何文本输出 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=sub

在Python中,通过
subprocess
调用命令的最短和标准方法是什么,但不必考虑其输出

我尝试了
subprocess.call
,但它似乎返回了输出。我并不为此烦恼,我只需要安静地运行程序,而不会让输出在屏幕上乱七八糟


如果有帮助的话,我正在调用
pdflatex
,我的目的就是调用它

只需按原样调用它,并在comamnd末尾添加>/dev/null即可。这将重定向任何文本输出

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,再输出到
子进程所准备的内存缓冲区。如何处理这些缓冲区的内容取决于您。您可以检查它们,也可以不必完全检查它们。但管道连接到这些缓冲区的副作用是,它们不会被打印到终端上

编辑:这也适用于方便的方法,
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
>子流程调用('ping 127.0.0.1')
使用32字节数据ping 127.0.0.1:

来自127.0.0.1的回复:bytes=32 time如果您的进程产生大量您不想在内存中缓冲的输出,您应该将输出重定向到电子垃圾桶:

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

特殊值
DEVNULL
表示将输出发送到操作系统的相应空设备(大多数操作系统上为
/dev/null
,另一个操作系统上为
nul

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

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


所以只需使用os,子进程在shell上执行一些事情,并将其o/p放入/dev/null即可

@duffymo:嗯,英语不是我的第一语言,你真的不必对它与它的对比如此恼火。@delnan:也许以后会吧,但现在我正在试图理解为什么
子进程。call
显示输出以及我如何抑制它。当然,我可能会使用
子进程。检查调用
,但这是另一个问题。pdflatex是否有“静默”命令行选项。如果是这样的话,在使用subprocess.call时只需将其传入即可。@Endophage:我不这么认为,只需查看
man
页面即可。另外,pdflatex只是一个例子。我很想知道如何抑制输出…@Patrick-除了你被纠正之外,没有人生气。在我看来,你应该感谢我——最好知道。不知何故,我不喜欢这样,我们将等待更好的答案:)除非你使用
shell=True
,否则这不会起作用,
shell=True
是邪恶的。它在Windows上根本不起作用。不要使用Windows=DYeah。我可以这样做。这似乎也适用于subprocess.call。您不应该将
stdout=subprocess.PIPE
subprocess.call()一起使用。没有人从管道中读取数据,因此缓冲区一满就会死锁。@SvenMarnach那么可以在调用后立即刷新缓冲区,使缓冲区永远不会变满吗?可能是一个无用的文件,然后使用
os.remove
?我想我正在尝试这样做,但它似乎没有真正起作用=/@Dana:
subprocess.call()
阻塞直到进程完成。如果在此期间缓冲区变满,它将死锁,并且调用后的代码将永远不会执行。将
stdout=PIPE
subprocess.call()一起使用是错误的。如果您对输出感兴趣,请使用
子流程。检查\u output()
。如果要使输出静音,请使用带有open(os.devnull,“w”)的
作为f:subprocess.call(“your_subprocess”,stdout=f)
@SvenMarnach awesome,非常感谢!现在我明白了真正的问题是什么:)这真的应该是公认的答案。所有这些“啊,让我们不要为缓冲区而烦恼,它们可能不会使您的程序死锁,它在大多数情况下都能工作”都是错误的,除了造成麻烦@phdoerfler感谢ping之外,没有任何用处。它让我意识到这个答案实际上已经过时了,我将其更新为使用Python3.3中引入的
subprocess.DEVNULL
!事实上,我希望得到ruby的
File::NULL
,例如
系统(“pdflatex”,filename,:out=>File::NULL,:err=>File::NULL,exception:true)
<代码>子流程。DEVNULL
符合要求!:)