將變數傳遞給subprocess.Popen:為什麼它不能使用列表中的參數
當使用subprocess.Phon 調用另一個Pyt 時調用另一個Pyt 時腳本時,您可能會遇到傳遞儲存在變數中的參數的問題。當您嘗試執行以下命令時,可能會發生這種情況:
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。啟用此標誌後,傳遞給 Popen() 的參數在 Unix 系統上的處理方式有所不同。 shell 將參數解釋為單一命令字串,這可能會導致意外行為。
解:
要解決此問題,放棄使用shell=True。相反,直接建立一個參數清單並將其傳遞給 Popen()。以下是一個範例:
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 p.stdout.close() p.wait()
透過刪除 shell=True 並手動建立參數列表,可以確保變數正確傳遞給被呼叫的腳本。
安全警告:
需要注意的是,為涉及外部輸入的命令傳遞 shell=True 可能會帶來安全風險,如子流程文件。如果您在腳本中處理使用者提供的輸入,強烈建議避免使用 shell=True 以防止潛在的漏洞。
以上是當 `shell=True` 時,為什麼 `subprocess.Popen` 不能使用清單中的變數參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!