python输出可执行文件_重定向-禁止在Python调用中输出可执行文件
重定向-禁止在Python調用中輸出可執行文件
我有一個名為B的二進制文件,該文件在調用時會生成輸出。 如果從Bash shell調用它,則大多數輸出將受到A > /dev/null的抑制。所有輸出將受到A &> /dev/null的抑制
我有一個名為B的Python腳本,需要調用B &> /dev/null。我希望能夠從B生成輸出,同時抑制來自2971490948489937937922的所有輸出。
在2971490948489937937920中,我嘗試了B、os.system('A > /dev/null')和os.system('A &> /dev/null')923、os.execvp('...')等,但是這些都不抑制A的所有輸出。
我可以運行B &> /dev/null,但是那也抑制了B的所有輸出,我不希望這樣。
有人有建議嗎?
Lin asked 2020-07-18T06:06:25Z
9個解決方案
102 votes
import os
import subprocess
command = ["executable", "argument_1", "argument_2"]
with open(os.devnull, "w") as fnull:
result = subprocess.call(command, stdout = fnull, stderr = fnull)
如果該命令沒有任何參數,則可以將其作為簡單字符串提供。
如果您的命令依賴于通配符,管道或環境變量之類的外殼功能,則需要將整個命令提供為字符串,并指定shell = True。但是,應避免這樣做,因為如果目錄中的內容包含安全隱患 的字符串未經過仔細驗證。
DNS answered 2020-07-18T06:07:09Z
57 votes
如果您擁有Python 2.4,則可以使用子流程模塊:
>>> import subprocess
>>> s = subprocess.Popen(['cowsay', 'hello'], \
stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
_______
< hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Manuel answered 2020-07-18T06:06:44Z
21 votes
在Python 3.3及更高版本中,open(os.devnull)支持重定向到open(os.devnull)的選項。要使用它,在調用.Popen和朋友時,請指定stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,作為關鍵字參數。
因此,針對Python 3.3+重寫的DNS答案變成了
import subprocess
command = ["executable", "argument_1", "argument_2"]
result = subprocess.call(command,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
從文檔中:
subprocess.DEVNULL?
可用作stdin,stdout或stderr的特殊值 Popen的參數,表示特殊文件os.devnull將 使用。
版本3.3中的新功能。
對于Python 3.0至3.2,您必須使用DNS所寫的方法使用open(os.devnull)手動打開空設備。
Mechanical snail answered 2020-07-18T06:07:55Z
12 votes
如果您的搜索引擎使您(與我一樣)遇到這個老問題,請注意使用PIPE可能會導致死鎖。實際上,由于管道是緩沖的,因此即使沒有人讀取管道,也可以在管道中寫入一定數量的字節。 但是,緩沖區的大小是有限的。 因此,如果您的程序A的輸出大于緩沖區,則A將在寫入時被阻塞,而調用程序B等待A的終止。但是,在這種情況下,則不會。請參閱下面的注釋。
不過,我還是建議使用Devin Jeanpierre和DNS的解決方案。
Po' Lazarus answered 2020-07-18T06:08:20Z
8 votes
如os.system()文檔所述,請使用子進程模塊,并在打開子進程時設置stdout = open(os.devnull,'w')(對于stderr可能也是如此)。
Devin Jeanpierre answered 2020-07-18T06:08:40Z
1 votes
我知道游戲已經晚了,但是為什么不簡單地從os.system中將輸出重定向到/ dev / null呢? 例如。:
tgt_file = "./bogus.txt"
os.sytem("d2u '%s' &> /dev/null" % tgt_file)
這似乎適用于您不想處理subprocess.STDOUT的情況。
Rob Carr answered 2020-07-18T06:09:05Z
0 votes
如果只需要捕獲STDOUT,就不將其分配給變量嗎? 例如:
megabyte=''
# Create a 1 MiB string of NULL characters.
for i in range(1048576):
megabyte += '\0'
fh=open('zero.bin','w')
# Write an 8 GiB file.
for i in range(8192):
print(i)
# Suppress output of 'write()' by assigning to a variable.
discard=fh.write(megabyte)
fh.close()
我在硬盤上創建了一個零填充的大文件,將零可用空間發現,每次對handle.write(string)的調用都吐出了寫入的字節數。 將其分配給可變參數會抑制該輸出。
ECJB answered 2020-07-18T06:09:29Z
0 votes
如果您不想等待命令完成(例如開始備份任務),另一種選擇是通過bash傳遞命令,這樣做可以使重定向正常運行。
例如,使用aplay啟動聲音文件:
import os
def PlaySound(filename):
command = 'bash -c "aplay %s &> /dev/null &"' % (filename)
os.system(command)
這樣,我可以生成一個新進程,而不必等待它完成并停止將其打印到終端。唯一的問題是它將加載bash實例以及您正在運行的進程,從而提供少量開銷。
PiBorg answered 2020-07-18T06:10:01Z
0 votes
我用:
call(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
其中command是命令的字符串+參數
為此,您必須導入子流程
TTT answered 2020-07-18T06:10:30Z
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python输出可执行文件_重定向-禁止在Python调用中输出可执行文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#处理JSON 数据
- 下一篇: 菜鸟python爬虫_Python爬虫学