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...
Bypassingシェルにより以前の解析の問題が解消され、コマンドを適切に実行できるようになります。
セキュリティ考慮事項:
外部入力を処理する場合、shell=True を設定することは、潜在的なセキュリティ上の危険があるため推奨されないことに注意することが重要です。このため、shell=True の使用を避け、代わりに上記で概説した方法を採用して Popen() に引数を渡すことをお勧めします。
以上が変数を引数として渡すときに subprocess.Popen が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。