2009-06-25 12 views
5

サブプロセスでこのコマンドを実行するにはどうすればよいですか?Python - サブプロセス - WindowsでPipedコマンドを呼び出す方法

私が試した:

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. 窓 コンソール上でコマンドを実行すると正常に動作します。
  2. もし私が削除したら ECHO bosco |上記のpopen呼び出しを 上手く実行します。だから私は この問題はエコーまたは と関連していると思う|。
+0

はフルラインが実際に働くことをしていますか? WindowsErrorは、問題はPythonコードではなく、実際に実行されるコマンドであることを示しています。 –

+0

はい、WindowsのDOSコンソールから実行されます。 – Greg

答えて

11

まず第一にパイプは必要ありません。あなたは入力を送信しているだけです。これにはsubprocess.communicateを使用できます。

第2に、コマンドを文字列として指定しないでください。スペースのあるファイル名が出現するとすぐにそれは面倒です。

第3に、実際にパイプコマンドを実行する場合は、シェルを呼び出すだけです。 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') 
+0

ありがとうございました! – Greg

4

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

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

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

これは渡し:あなたがWindowsコンソールでそれを実行したときにプリントNiと0

subprocess.call(["ECHO", "Ni"], shell=True) 
+0

実際には、これは 'subprocess.call(" ECHO Ni "、shell = True)'ではないでしょうか? 'subprocess.call([" ECHO "、" Ni "])'はうまく動作します。 – Chris

+0

[Popen Constructor](https://docs.python.org/3/library/subprocess.html#popen-constructor) docsに従ってどちらかを使用することができます: "特に明記しない限り、argsを渡すことをお勧めしますシーケンスとして。 –

関連する問題