首頁 > 後端開發 > Python教學 > 如何在不執行 Shell 的情況下正確地將變數傳遞給 `subprocess.Popen()`?

如何在不執行 Shell 的情況下正確地將變數傳遞給 `subprocess.Popen()`?

Barbara Streisand
發布: 2024-11-28 06:41:10
原創
336 人瀏覽過

How to Properly Pass Variables to `subprocess.Popen()` without Shell Execution?

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中文網其他相關文章!

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