2017-12-29 2 views
1

파이썬 서브 프로세스로 코드를 작성하려고합니다.파이썬의 서브 프로세스가 성공했는지 또는 에러가 발생했는지 여부를 확인하고 싶습니다.

#code = 'print("hey")' #OK 
code = 'print"hey")' #SyntaxError 
with open(filename, 'w') as f: 
    f.write(code) 

proc = s.Popen(['python',filename], stdout=s.PIPE, stderr=s.STDOUT) 
stdout_v, stderr_v = proc.communicate('') 
print(stdout_v.decode('utf8')) 

대략 비슷합니다.

현재 정상적으로 작동하거나 구문 오류가 발생하더라도 하위 프로세스의 반환 값은 stdout_v에 포함되어 있으며이를 구분할 수 없습니다.

정상적으로 실행되면 출력을받을 수 있으며 오류가 발생하면 서브 프로세스에서 오류 메시지가 나타날 수 있습니까?

+0

파이썬 3.5 이상을 사용할 수 있습니까? –

+0

'proc.returncode'를 확인하십시오. –

+0

BTW - 브라우저에서 실행할 수있는 HTML/JavaScript를 제외하고는 "스 니펫"단추를 사용하지 마십시오. '{}'버튼은 다른 언어의 코드 형식을 지정하는 데 사용해야합니다. –

답변

3

파이썬 3.5+에서 서브 프로세스를 사용하는 권장 방법은 run function입니다. 반환 코드 (약간의 오차 발생의 표시 임) 0이 아닌 경우

proc = s.run(['python',filename], stdout=s.PIPE, stderr=s.PIPE, check=False) 
stdout_v, stderr_v, = proc.stdout, proc.stderr 
return_code = proc.return_code 

세트 check=True 오류가 발생한다.

이전 버전의 Python에서는 일반적으로또는 call 기능을 사용하는 것이 좋습니다. Check_output은 0이 아닌 종료 코드를 발견하면 오류를 발생 시키지만 call 함수는 정상적으로 계속됩니다. 문서

https://docs.python.org/2/library/subprocess.html

에서

+0

'실행'이 '선호되는 방식'이라는 주장은 어디에서 얻을 수 있습니까? [이전 메커니즘을'subprocess'로 대체하는 데 관한 문서] (https://docs.python.org/2/library/subprocess.html#replacing-older-functions-with-the-process-module)는 'run'뿐만 아니라, 사용합니다. –

+0

run 함수에 대한 설명서에는 "하위 프로세스를 호출 할 때 권장되는 방법은 처리 할 수있는 모든 사용 사례에 대해 run() 함수를 사용하는 것입니다." –

+0

Ahh. 이것이 Python-3에만 해당한다는 점에 유의하십시오. –

0

당신은 인수

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

실행 명령으로 명령 유효성을 확인하실 수 있습니다. 명령이 완료 될 때까지 기다리십시오. 반환 코드가 0이면 반환하고 그렇지 않으면 CalledProcessError를 발생시킵니다. CalledProcessError 객체는 returncode 속성에 반환 코드를 갖습니다.

Return code 0= Sucess 

당신이 인수 명령의 출력

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) 

실행 명령을 참조하고 바이트 문자열로 출력을 반환하고자하는 경우.

+0

리턴 코드를 '1'과 비교하여 실패를 확인할 수 없습니다. 0 이외의 경우 실패입니다. 또한 CalledProcessError의 returncode 속성은 성공해도 throw되지 않으므로 0이 아닙니다. 성공/실패를 확인하기 만하면 returncode를 확인하는 것이 필요하지 않습니다. 예외를 catch하고 거기에서 실패 사례를 처리하십시오. – SpoonMeiser

+0

리턴 코드를 제거했습니다. 1 = 실패했습니다. 입력에 대해 감사합니다. –

관련 문제