如何只调用命令而不获取其输出[重复]

Posted

技术标签:

【中文标题】如何只调用命令而不获取其输出[重复]【英文标题】:How to just call a command and not get its output [duplicate] 【发布时间】:2011-06-27 04:19:13 【问题描述】:

在 Python 中,通过subprocess 调用命令但不关心其输出的最短和标准方式是什么。

我尝试了subprocess.call,但它似乎返回了输出。我对此并不在意,我只需要静默运行程序,而不会使屏幕上的输出杂乱无章。

如果有帮助,我会打电话给pdflatex,我的目的只是打电话给它。

【问题讨论】:

@duffymo:嗯,英语不是我的第一语言,你真的不必对它与它的关系如此生气。 @delnan:也许以后可能,但现在我试图理解为什么subprocess.call 显示输出以及如何抑制它。当然我可以使用subprocess.check_call,但这是另一个问题。 pdflatex 是否有“静默”命令行选项。如果是这样,请在使用 subprocess.call 时将其传入。 @Endophage:我不这么认为,只是检查了man 页面。此外,pdflatex 只是一个例子。我有兴趣知道如何抑制输出... @Patrick - 没有人生气,除了你被纠正了。你应该感谢我——在我看来,最好知道。 【参考方案1】:

直接调用它,然后在命令末尾添加 >/dev/null。这将重定向任何文本输出。

【讨论】:

我不喜欢这个,我们会等待更好的答案:) 这行不通,除非你使用shell=True,而shell=True 是邪恶的。它在 Windows 上根本不起作用。 不要使用windows =D【参考方案2】:
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 准备的内存缓冲区,这个“管道”。您如何处理这些缓冲区的内容取决于您自己。您可以检查它们,或者完全不理会它们。但是管道到这些缓冲区的副作用是它们不会被打印到终端。

edit:这也适用于便捷方法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-2subprocess.call 的注意事项:

注意:请勿将 stdout=PIPE 或 stderr=PIPE 与此功能一起使用。作为 当前进程中没有读取管道,子进程可能 如果它生成足够的输出到管道以填满操作系统管道,则阻止 缓冲区。

【讨论】:

是的,我可以用这个。这似乎也适用于 subprocess.call。 您不应该将stdout=subprocess.PIPEsubprocess.call() 一起使用。没有人从管道中读取,所以一旦缓冲区满了就会死锁。 @SvenMarnach 那么是否可以在调用后立即刷新缓冲区,以便缓冲区永远不会变满?也许进入一个无用的文件,然后使用os.remove 立即删除?以为我正在尝试这样做,但它似乎并没有真正起作用=/ @Dana: subprocess.call() 阻塞直到进程完成。如果在此期间缓冲区已满,它将死锁,并且调用之后的代码将永远不会被执行。将stdout=PIPEsubprocess.call() 一起使用是错误的。如果您对输出感兴趣,请使用subprocess.check_output()。如果要使输出静音,请使用with open(os.devnull, "w") as f: subprocess.call("your_subprocess", stdout=f) @SvenMarnach 太棒了,非常感谢!现在我明白了真正的问题是什么:)【参考方案3】:

如果您的流程产生了大量您不想在内存中缓冲的输出,您应该将输出重定向到电子垃圾桶:

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

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

【讨论】:

这确实应该是公认的答案。所有这些其他“啊,让我们不要打扰缓冲区,它们可能不会使您的程序死锁,它大部分时间都可以工作”只是完全错误并且除了造成麻烦之外没有任何好处 @phdoerfler 感谢您的 ping。它让我意识到这个答案实际上已经过时了,我将其更新为使用 Python 3.3 中引入的subprocess.DEVNULL 更好,是的!事实上,我希望得到类似 ruby​​ 的File::NULL,例如system("pdflatex", filename, :out =&gt; File::NULL, :err =&gt; File::NULL, exception: true)subprocess.DEVNULL 符合要求! :)【参考方案4】:

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

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

所以只需使用 os,subprocess 在 shell 上执行一些事情,然后将其 o/p 放入 /dev/null。

【讨论】:

以上是关于如何只调用命令而不获取其输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 nmap 输出发送到文件而不将其打印到标准输出

如何在nodejs里调用执行系统命令

如何在nodejs里调用执行系统命令

如何在不获取输出的情况下调用发送函数?

如何在命令中使用文件并将输出重定向到同一个文件而不截断它?

如何调用外部程序并从另一个程序获取其输出