5

このコマンドをサブプロセスで実行するにはどうすればよいですか?

私は試した:

proc = subprocess.Popen(
    '''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''',
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
   stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate()

しかし得た:

Traceback (most recent call last):
...
  File "C:\Python24\lib\subprocess.py", line 542, in __init__
    errread, errwrite)
  File "C:\Python24\lib\subprocess.py", line 706, in _execute_child
    startupinfo)
WindowsError: [Errno 2] The system cannot find the file specified

私が気づいたこと:

  1. Windowsコンソールでコマンドを実行すると正常に機能します。
  2. ECHOボスコを外せば| 部分的には、上記のpopen呼び出しで正常に実行されます。したがって、この問題はエコーまたは|に関連していると思います。
4

2 に答える 2

11

何よりもまず、実際にはパイプは必要ありません。入力を送信しているだけです。そのためにsubprocess.communicateを使用できます。

次に、コマンドを文字列として指定しないでください。スペースを含むファイル名が含まれるとすぐに、それは厄介です。

第三に、本当にパイプコマンドを実行したい場合は、シェルを呼び出すだけです。Windowsでは、そうだと思いますcmd /c program name arguments | further stuff

最後に、シングルバックスラッシュは危険な場合があります:"\p"はですが'\\p''\n'改行です。os.path.join()またはos.sepを使用するか、Pythonの外部で指定されている場合は、スラッシュだけを使用します。

proc = subprocess.Popen(
    ['C:/Program Files/GNU/GnuPG/gpg.exe',
    '--batch', '--passphrase-fd', '0',
    '--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt',
    '--decrypt', 'test.txt.gpg',],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
   stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate('bosco')
于 2009-06-25T22:18:50.433 に答える
4

あなたは正しかった、ECHOが問題だ。shell = Trueオプションがないと、ECHOコマンドが見つかりません。

これはあなたが見たエラーで失敗します:

subprocess.call(["ECHO", "Ni"])

これは合格です:Niと0を出力します

subprocess.call(["ECHO", "Ni"], shell=True)
于 2011-05-09T21:02:49.463 に答える