2010-04-01 2 views

답변

7

subprocess.call()을 사용하십시오. 워드 프로세서 :

subprocess.call (* popenargs, ** kwargs로) 인수
실행 명령. 명령이 완료 될 때까지 기다린 후 returncode 속성을 반환하십시오. 인수는 Popen 생성자와 동일합니다.

편집 :

subprocess.call()wait()를 사용하고, wait()이 교착 상태에 취약 (토미 허버트는 지적). 워드 프로세서에서 :

경고 : 자식 프로세스는 OS 파이프에 대한 버퍼를 기다리는 등 그 그것은 블록 더 많은 데이터를 수용 할 수있는 표준 출력 또는 표준 오류 파이프에 충분한 출력 을 생성하는 경우이 교착 상태 것이다. 이를 피하려면 communicate()를 사용하십시오. 명령 출력을 많이 생성하는 경우

그래서, 대신 communicate()를 사용

p = subprocess.Popen(
    ["scanx", "--udp", host], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE) 
out, err = p.communicate() 
+0

poll()과 달리 데드락이 발생할 위험이 있습니다. –

+0

@ 토미, 좋은 지적. 이 대답에 확장 내 대답. 감사. –

+0

많은 분들께 감사드립니다. –

7

당신이 stdoutstderr에 devnull을 통과 할 수있는 모든 당신 출력이 필요하지 않은 경우. 나는 이것이 차이를 만들 수 있지만 bufsize를 전달할 수 있는지 모르겠습니다. 이제 devnull 사용 subprocess.call 더 이상 교착 상태가 발생하지 않습니다.

import os 
import subprocess 

null = open(os.devnull, 'w') 
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null) 
+0

내 경우에는 여전히 "stdout = subprocess.Pipe"를 사용하는 경우 "bufsize = x"가 내 문제를 해결하지 못했습니다. 그러나 "stdout = null"은 잘 작동했습니다. 그러나, 파이썬은 이미 "stdout = None"을 사용할 수있게 해준다. 여기서 null 변수를 대체 할 수있다. ;) – ForceMagic

+0

동일하지 않습니다. "... 없음을 지정하면 리다이렉션이 발생하지 않고 자식 파일 핸들은 부모로부터 상속됩니다 ..."예제를 사용하여 모든 출력을 널 장치로 리디렉션합니다. –

관련 문제