[英]Redirecting stdio from a command in os.system() in Python
通常我可以通過更改sys.stdout
的值來更改 Python 中的標准輸出。 但是,這似乎只影響print
語句。 那么,有什么方法可以抑制通過 Python 中的os.system()
命令運行的程序的輸出(到控制台)?
您可以考慮通過運行程序subprocess.Popen
,與subprocess.PIPE
溝通,然后推該輸出在任何你想,但就是os.system
只運行命令,而不是其他。
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模塊
在UNIX系統上,您可以將stderr和stdout重定向到/ dev / null作為命令本身的一部分。
os.system(cmd + "> /dev/null 2>&1")
重定向標准錯誤和標准錯誤。
如果要完全消除隨python程序啟動的控制台,則可以使用.pyw擴展名保存它。
我可能會誤解這個問題。
我在尋找執行命令的pythonic方式時找到了這個答案。 如果命令等待輸入,則接受的答案會出現死鎖。 但是僅用 write 反向讀取是不夠的,因為如果命令在讀取之前寫入更大的輸出,則會出現死鎖。 避免這個問題的方法是使用p.communicate
甚至更好Popen.run
來為你做這件事。
這里有些例子:
要丟棄或讀取輸出:
>>> import subprocess
>>> r = subprocess.run("pip install fastai".split(), capture_output=True)
# you can ignore the result to discard it or read it
>>> r.stdout
# and gets stdout as bytes
要將某些內容傳遞給進程,請使用輸入:
>>> import subprocess
>>> subprocess.run("tr h H".split(), capture_output=True, text=True, input="hello").stdout
'Hello'
如果你真的不想處理stdout,你可以通過subprocess。 DEVNULL 到 stdout 和 stderr 如下:
>>> import subprocess as sp
>>> sp.run("pip install fastai".split(), stdout=sp.DEVNULL, stderr=sp.DEVNULL).returncode
0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.