簡體   English   中英

從 Python 中的 os.system() 中的命令重定向 stdio

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM