首頁 > 後端開發 > Python教學 > 為什麼 subprocess.Popen 在將變數作為參數傳遞時失敗,如何修復?

為什麼 subprocess.Popen 在將變數作為參數傳遞時失敗,如何修復?

Linda Hamilton
發布: 2024-12-04 04:32:10
原創
541 人瀏覽過

Why Does subprocess.Popen Fail When Passing Variables as Arguments, and How Can I Fix It?

對Subprocess.Popen 參數傳遞差異進行故障排除

嘗試將變數傳遞給subprocess.Popen() 以執行腳本時,用戶可能會遇到困難如果參數儲存在變數中。為了解決這個問題,讓我們深入研究問題並提供解決方案。

問題:

最初的方法涉及直接從變數傳遞參數,如下所示:

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)
登入後複製

但是這個方法執行指令失敗

解決方案:

解決這個問題的關鍵在於去掉shell=True。當設定為 True 時,Popen() 的參數在 Unix 系統上的處理方式不同,導致解析錯誤。透過刪除 shell=True,我們可以直接將參數作為列表傳遞:

import sys
from subprocess import Popen, PIPE

# populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# use p.stdout here...
登入後複製

繞過shell 消除了先前的解析問題並允許正確執行命令。

安全性注意事項:

需要注意的是,由於潛在的安全隱患,在處理外部輸入時不鼓勵設定 shell=True。因此,建議避免使用 shell=True ,而是採用上面概述的方法將參數傳遞給 Popen()。

以上是為什麼 subprocess.Popen 在將變數作為參數傳遞時失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板