Redirecting stdio from a command in os.system() in Python
通常我可以通过更改sys.stdout的值来更改Python中的stdout。 但是,这似乎只会影响print语句。 那么,有什么方法可以抑制在Python中通过os.system()命令运行的程序的输出(到控制台)?
您可以考虑通过subprocess.Popen运行程序,通过subprocess.PIPE通信,然后将输出推送到任何您想要的位置,但是按原样,os.system只运行命令,而不是其他任何内容。
1 2 3 4 5 6
| from subprocess import Popen, PIPE
p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE)
output = p.stdout.read()
p.stdin.write(input) |
我认为更加灵活。 您可能需要查看完整的文档:Python Subprocess模块
-
嗯......好吧。因此,在P = Popen(...)行上执行命令,是吗?它只会在调用p.stdout.read()时显示输出...是的?谢谢
-
好的......命令确实运行了,但是在一个单独的线程中。无论如何,我可以在命令运行时对程序进行操作,或者将它保存在同一个线程中?谢谢。
-
简单地说,使用p.wait()。但是,如果程序生成足够的输出,显然这会在使用PIPE标准输出时导致死锁。请参阅docs.python.org/library/subprocess.html#subprocess.Popen.wait上的完整文档。但是,我认为它应该工作..
-
嗯......好的,谢谢。此外,似乎使用p.communicate()(而不是p.stdout将有助于清除管道。谢谢。
在unix系统上,您可以将stderr和stdout重定向到/ dev / null作为命令本身的一部分。
1
| os.system(cmd +"> /dev/null 2>&1") |
-
这只适用于unix系统
-
是,对的。更新答案以避免混淆。
-
这是我正在寻找的答案,应该是接受的答案。
如果要完全消除使用python程序启动的控制台,可以使用.pyw扩展名保存它。
不过,我可能会误解这个问题。
重定向stderr以及stdout。
-
这不是来自docs.python.org/library/os.html#process-management os.system(command)的工作引用在子shell中执行命令(字符串)。这是通过调用标准C函数系统()来实现的,并且具有相同的限制。对sys.stdin等的更改不会反映在已执行命令的环境中。