我嘗試在 Ubuntu 上運行代碼,該代碼適用于 Windows:
import subprocess
ARGS = ["ping", "google.com"]
process = subprocess.Popen(ARGS, stdout=subprocess.PIPE)
data = process.communicate()
print(data)
在 Windows 下運行時,此代碼列印出 ping 包的元組。但是在 Ubuntu 上運行的相同代碼只是掛起,沒有別的!
誰能向我解釋為什么?
uj5u.com熱心網友回復:
在Windows上測驗后,我看到ping在Windows中發送了4個資料包并停止了。ping另一方面,在 Ubuntu 中,發送無限資料包直到退出程式。
該process.communicate()命令將等待檔案結束 (EOF) 信號,顯然它在 Windows 中到達,但在 Ubuntu 中不會到達。解決方案是ping在 Ubuntu 中終止。您可以ping使用-c標志限制發送的資料包數量。這樣做 ARGS = ["ping", "-c", "4", "google.com"]應該讓你的程式列印 4 個正在發送的資料包的結果。
uj5u.com熱心網友回復:
ping大多數平臺上的默認行為是永遠發送更多資料包。這看起來像是“掛起”,因為您的 Python 代碼正在等待子行程完成,但它永遠不會(盡管最終您會用緩沖輸出填滿記憶體)。
您想添加一個選項來限制資料包的數量,例如
result = subprocess.run(
['ping', '-c', '4', 'google.com'],
capture_output=True, check=True, text=True)
data = result.stdout
還要注意subprocess.run()in 優先于低級Popen函式的使用。就像檔案已經告訴你的那樣,Popen如果你可以避免它,你不想自己管理物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/361767.html
