2009-06-25 7 views
5

하위 프로세스에서이 명령을 어떻게 실행합니까?Python - Subprocess - 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 보스코 | 부분, 위의 popen 호출 잘 실행됩니다. 그래서 나는 이 문제는 echo 또는 와 관련이 있다고 생각합니다.
+0

전체 라인이 실제로 작동합니까 것을

이것은 당신이 본 오류와 함께 실패? WindowsError는 문제가 파이썬 코드가 아니라 실제 명령이 실행될 것을 제안합니다. –

+0

예. Windows 콘솔에서 실행됩니다. – Greg

답변

11

먼저 파이프는 실제로 필요하지 않습니다. 당신은 단지 의견을 보내고 있습니다. 그것에 대해 subprocess.communicate을 사용할 수 있습니다.

두 번째로, 명령을 문자열로 지정하지 마십시오. 공백이있는 파일 이름이 포함되면 바로 지저분 해집니다.

셋째, 실제로 파이프 명령을 실행하려면 셸을 호출하십시오. Windows에서 나는 그것이 cmd /c program name arguments | further stuff이라고 생각합니다.

마지막으로 단일 백 슬래시는 위험 할 수 있습니다. "\p"'\\p'이지만, '\n'은 줄 바꿈입니다. os.path.join() 또는 os.sep을 사용하거나, 파이썬 밖에서 지정된 경우에는 슬래시 만 사용하십시오.

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

당신이 옳았습니다. 에코가 문제입니다. shell = True 옵션이 없으면 ECHO 명령을 찾을 수 없습니다.

subprocess.call(["ECHO", "Ni"]) 
이 통과

: 인쇄 니켈하고 그것이 Windows 콘솔에서 실행할 때 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를 전달하는 것이 좋습니다 시퀀스로. " –

관련 문제