アンパサンドに関する Python サブプロセスの問題
-
02-07-2019 - |
質問
現在、Python スクリプトで大きな問題が発生しています。このスクリプトは、ハンドラーを通じて任意のコマンドを実行し、誤ったエラー レポートを正しいエラー レポートに変換します。
私が抱えている問題は、パスにアンパサンドを含むコマンドを使用してスクリプトを Windows 上で正しく動作させることです。アンパサンドを ^ でエスケープしてコマンドを引用しようとしましたが、どちらも機能しません。もうアイデアが尽きました。助言がありますか?
現在の回答から明確にするには:
- サブプロセスモジュールを使用しています
- コマンドラインと引数をリストとして渡しています
- 問題は引数ではなく、コマンド自体へのパスにあります。
- コマンドを引用してみました。それは、
[Error 123] The filename, directory name, or volume label syntax is incorrect
エラー - シェル引数を使用していません(つまり、
shell=false
) - 重要な場合に備えて、処理のために標準エラー出力へのパイプを取得していますが、標準出力と標準入力は無視しています。
- 現在、これは Windows でのみ使用されており、これまでにテストした他のすべてのケースで期待どおりに動作します。
- 失敗しているコマンドは次のとおりです。
p = サブプロセス.Popen(prog, stderr = サブプロセス.PIPE, bufsize=-1)
リスト「prog」の最初の要素にアンパサンドが含まれている場合。この最初の文字列を引用符で囲んでも機能しません。
解決
リストを使用し、シェル拡張を使用していないことを確認してください。
subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)
他のヒント
適切な回答にはそれ以上の情報が必要です。実際に何をしているのですか?どのように失敗するのでしょうか?サブプロセスモジュールを使用していますか?引数のリストとshell=Falseを渡していますか(またはシェル引数なし)、それとも実際にシェルを呼び出していますか?
& を含む引数を引用符で囲んでみてください。
wget "http://foo.com/?bar=baz&baz=bar"
通常、Linux シェルで実行する必要があるものです
「アンパサンドを ^ でエスケープする」
本気ですか ^
は Windows のエスケープ文字ですか?使用すべきではないでしょうか \
?
私自身の質問に答えるには:
パラメータをリストとして渡すときに実際のコマンドを引用符で囲むと正しく機能しない(コマンドがリストの最初の項目である)ため、問題を解決するためにリストをスペース区切りの文字列に変換し、代わりにそれをサブプロセスに渡しました。
より良いソリューションは引き続き歓迎されます。
次のような状況を試してみます。
exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)
これは効果があります。