Python 하위 프로세스 통신 방법을 사용할 때 종료 코드를 얻는 방법은 무엇입니까?


186

파이썬 subprocess모듈과 communicate()메소드를 사용할 때 종료 코드를 어떻게 검색 합니까?

관련 코드 :

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

다른 방법으로해야합니까?

답변:


266

Popen.communicatereturncode완료되면 속성 을 설정합니다 (*). 관련 문서 섹션은 다음과 같습니다.

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasnt terminated yet.

  A negative value -N indicates that the child was terminated by signal N (Unix only).

그래서 당신은 할 수 있습니다 (테스트하지는 않았지만 작동해야합니다).

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*) 이것은 구현 방식으로 인해 발생합니다. 자식 스트림을 읽기 위해 스레드를 설정 한 후을 호출합니다 wait.


34
이 예제는 저에게 도움이되었지만, 예제가 표준을 모호한 약어로 가져 오는 "하위 프로세스를 sp로 가져 오기"패턴을 수행하지 않으면 좋을 것입니다. 이렇게하면 뒤에 나오는 코드에서 8자가 잘리지 만 이해하고 재사용하기가 어렵습니다.
uglycoyote

16
@uglycoyote 복사하여 붙여 넣어야한다는 규칙은 없습니다. 원하는대로 다시 입력하면 4 줄과 같습니다.
Jason C

5
@uglycoyote 당신은 또한 그것을 비슷한 것으로 편집 from subprocess import Popen한 다음 Popen대신에 subprocess(or sp).Popen가독성을 높이고 줄을 단축시키는 대신 사용할 수 있습니다
Mitch

2
예 .. 변수를 호출 process.communicate()한 다음 할당 해야합니다 returncode. 호출하기 전에 할당이 완료 communicate되면입니다 None.
WesternGun

1
파이프를 리디렉션하지 않고 리턴 코드를 표시 할 수 있습니까? 나는 bash 코드를 호출하고 있으며 터미널에서 출력을 실시간으로보고 싶습니다
Nisba

10

먼저 프로세스 실행이 완료되었고 .wait메소드를 사용하여 리턴 코드를 읽었는지 확인해야합니다 . 코드가 반환됩니다. 나중에 액세스 .returncode하려면 Popen객체 와 같이 저장됩니다 .


24
.communicate()이미 서브 프로세스가 종료되기를 기다립니다.
기계 달팽이

8

.poll() 리턴 코드를 업데이트합니다.

시험

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

또한 after .poll()를 호출하면 객체에서로 코드를 사용할 수 있습니다 child.returncode.


내가 이것을했을 때 .poll ()은 비어있었습니다. 이것이 작동하려면 child.communicate () 위의 child.poll () 행을 실행해야했습니다.
NateW

1
: 난 당신이 문서에 따라, 대신 .poll ()의) .wait를 (사용하는 의미 생각 docs.python.org/3/library/subprocess.html . .wait ()는 편리한 시간 제한 매개 변수를 사용합니다.
gg99


1

이것은 나를 위해 일했습니다. 또한 자식 프로세스가 반환 한 출력을 인쇄합니다

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.