Subprocess.Popen() 的變數傳遞問題
當嘗試將儲存在變數中的參數傳遞給subprocess.Popen() 時,有些用戶經歷困難。在處理如下參數時尤其如此:
servers[server]['address'] servers[server]['port'] servers[server]['pass']
將這些變數直接應用於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 執行
要解決此問題,請刪除來自Popen() 呼叫的shell=True 參數。這將防止 shell 對參數進行特殊處理,從而允許它們作為字串傳遞。
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 的情況下正確地將變數傳遞給 `subprocess.Popen()`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!