5

現在、Python スクリプトで大きな問題が発生しています。このスクリプトは、ハンドラーを介して任意のコマンドを実行し、誤ったエラー レポートを正しいエラー レポートに変換します。

私が抱えている問題は、パスにアンパサンドを含むコマンドを使用して、スクリプトを Windows で正しく動作させることです。アンパサンドを ^ でエスケープして、コマンドを引用しようとしましたが、どちらも機能しません。私は今、アイデアがありません。助言がありますか?

現在の回答から明確にするために:

  1. subprocess モジュールを使用しています
  2. コマンドライン+引数をリストとして渡しています
  3. 問題は、引数ではなく、コマンド自体へのパスにあります
  4. コマンドを引用してみました。[Error 123] The filename, directory name, or volume label syntax is incorrectエラーの原因となります
  5. シェル引数を使用していません(だからshell=false
  6. 問題が発生した場合に備えて、処理のために stderr へのパイプを取得していますが、stdout と stdin は無視しています
  7. 現在は Windows でのみ使用でき、これまでにテストした他のすべてのケースで期待どおりに動作します。
  8. 失敗しているコマンドは次のとおりです。

p = subprocess.Popen(prog, stderr = subprocess.PIPE, bufsize=-1)

リスト「prog」の最初の要素にアンパサンドが含まれている場合。この最初の文字列を引用しても機能しません。

4

6 に答える 6

6

リストを使用していて、シェル展開がないことを確認してください。

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)
于 2008-09-23T12:36:19.823 に答える
1

「^でアンパサンドをエスケープ」

^Windows へのエスケープ文字でよろしいですか? 使うべきではありません\か?

于 2008-09-23T13:29:31.160 に答える
1

適切な回答には、それ以上の情報が必要です。あなたは実際に何をしていますか?どのように失敗しますか?subprocess モジュールを使用していますか? 引数のリストと shell=False (またはシェル引数なし) を渡していますか、それとも実際にシェルを呼び出していますか?

于 2008-09-23T12:36:18.123 に答える
1

& を含む引数を引用してみてください

wget "http://foo.com/?bar=baz&baz=bar"

通常、Linux シェルで行う必要があること

于 2008-09-23T12:36:32.630 に答える
0

私自身の質問に答えるには:

パラメーターをリストとして渡すときに実際のコマンドを引用すると正しく機能しません (コマンドはリストの最初の項目です)。この問題を解決するために、リストをスペースで区切られた文字列に変換し、代わりにサブプロセスに渡しました。

より良いソリューションは引き続き歓迎されます。

于 2008-09-23T12:49:55.423 に答える