2014-12-16 3 views
3

내 코드는 다음과 같습니다. 기본적으로이 모듈은 필요한 명령을 실행하고 줄 바꿈을 캡처하지만 내 경우에는 명령이 실행될 때 명령 프롬프트로 돌아 가기 위해 몇 초가 걸립니다. thats where child.stdout.read (1)이 멈추고,이 명령을 사용하여 정상적인 명령을 실행하면 예상대로 모든 것이 인쇄됩니다. 하지만 명령을 인쇄 STDOUT에 뭔가를해야만하고 프롬프트로 돌아가려면 시간이 좀 걸립니다, 특별한 경우에, 그것은 중단 .. 도와주세요파이썬 STDOUT 실시간 읽기

새로운 코드 :

def run_command(shell_command): 
'''run the required command and print the log''' 
child = subprocess.Popen(shell_command, shell=True,stdout=subprocess.PIPE) 
(stdoutdata, stderrdata) = child.communicate() 
print stdoutdata 

print "Exiting.." 

오류 :

File "upgrade_cloud.py", line 62, in <module> 
stop_cloud() 
File "upgrade_cloud.py", line 49, in stop_cloud 
run_command(shell_command) 
File "upgrade_cloud.py", line 33, in run_command 
(stdoutdata, stderrdata) = child.communicate() 
File "/usr/lib/python2.6/subprocess.py", line 693, in communicate 
stdout = self.stdout.read() 
KeyboardInterrupt 

child.wait() 

이 줄은 자식 시저를 기다리는 파이썬 원인 :

+0

음 ...이 문제는 [issue 7213] (http://bugs.python.org/issue7213) 일 수 있습니다. 동시에 여러 개의 Popen 인스턴스를 실행하고 있습니까? – Kevin

+0

아니요, 한 번에 하나의 명령 만 실행하고 나옵니다. –

+0

제발 도와주세요, 나는이 문제에 붙어있다 –

답변

3

여기에 문제의 끝내려면 끝이야. 자식 프로세스가 stdout으로 많은 양의 데이터를 인쇄하려고하면, Python이 상기 데이터를 읽는 것을 기다리는 것을 차단할 것이다. 파이썬은 자식 프로세스를 기다리고 있고 자식 프로세스는 파이썬을 기다리고 있기 때문에 교착 상태가 발생합니다.

subprocess.Popen 대신 subprocess.check_output()을 사용하는 것이 좋습니다. .wait() 메서드 대신 Popen.communicate() 메서드를 사용할 수도 있습니다.

+0

Python 2.6.5 (r265 : 79063, 2014 년 2 월 27 일, 2014, 19시 43 분 51 초) [GCC 4.4.3] on linux2 자세한 내용은 "help", "copyright", "credits"또는 "license"를 입력하십시오. 버전이 2.6이면 check_output이 없으므로 환경을 최신 파이썬으로 업그레이드 할 수 없습니다 –

+0

그래서 .wait() 대신 .communication()을 사용하십시오. – Kevin

+0

run_command에서 파일 "upgrade_cloud.py"14 행 child.communicate() 파일 "/usr/lib/python2.6/subprocess.py", 줄 693, 통신 stdout = self. stdout.read() KeyboardInterrupt .. 키보드 인터럽트를 사용해야했습니다. –