subprocess.Popen과 os.system의 차이점


답변:


99

Python 문서하위 프로세스 섹션 을 확인하면 다음 으로 대체하는 방법에 대한 예제가 있음을 알 수 os.system()있습니다 subprocess.Popen().

sts = os.system("mycmd" + " myarg")

... 같은 일을 ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

"개선 된"코드는 더 복잡해 보이지만 일단 알게 subprocess.Popen()되면 다른 것이 필요하지 않기 때문에 더 좋습니다 . 세 개의 다른 Python 모듈에 흩어져 있던 subprocess.Popen()여러 다른 도구 ( os.system()그 중 하나 일뿐)를 대체 합니다.

도움이된다면 subprocess.Popen()매우 유연한 것으로 생각하십시오 os.system().


sts = p.wait()마지막 줄 대신 사용할 수도 있습니다 .
Sven Marnach 2011 년

1
@JacobMarble 그래서 다른 파이썬 스크립트에서 셀레늄 스크래핑 스크립트를 호출한다고 가정합니다.이 중 어느 것이 스크랩 스크립트를 완료 한 다음 다음 코드 줄만 실행할 수있게하나요? 에서와 같이 내 스크 레이 핑이 완료되어야 실행이 계속됩니다.
Prakhar Mohan Srivastava

stackoverflow.com/questions/3172470/… 을 언급 하여 가능 shell=True하다면 피해야한다는 점을 지적 할 수도 있습니다. 이 옵션을 사용하는 것은의 장점 중 하나이며 subprocess.Popen()도우미 기능입니다.
tripleee

@PrakharMohanSrivastava 당신은에서의 작업 점검을 완료 흐름을 차단하고 명령 대기 할 경우 stackoverflow.com/a/2837319/5252192
AmirHossein

일반적으로 @PrakharMohanSrivastava, 모두 os.systemsubprocess.call/popen/run마무리에 대한 명령 블록 / 대기 작업을 수행합니다 stackoverflow.com/a/14059648/4752883
alpha_989

47

subprocess.Popen()의 엄격한 수퍼 세트입니다 os.system().


10
이것은 완전한 우아한 대답입니다.
Farsheed

23

os.system이는 Unix system명령 과 동일하며 명령 subprocess이 제공하는 많은 기능을 Popen더 쉽고 제어 가능한 인터페이스 로 제공하기 위해 만들어진 도우미 모듈입니다 . 그것들은 Unix Popen 명령 과 유사하게 설계되었습니다 .

system()를 호출하여 command에 지정된 명령을 실행하고 명령 /bin/sh -c command이 완료된 후 반환합니다.

이므로:

popen()함수는 파이프를 만들고, 분기하고, 셸을 호출하여 프로세스를 엽니 다.

어떤 것을 사용할지 생각하고 있다면 subprocess실행을위한 모든 기능과 프로세스에 대한 추가 제어가 있기 때문에 확실히 사용 하십시오.


좋아 .. 그러면 내가 os.system과 popen을 Windows 환경에서 실행할 수있는 방법이 있습니까? 나는 초보자이고 더 깊이 파헤쳐 야합니다.
Arovit

예, Windows 환경에서 os.system과 하위 프로세스를 모두 사용할 수 있습니다. effbot.org (파이썬 표준 라이브러리 온라인 책)에서 기본 튜토리얼을 살펴 가지고
센씰 Kumaran

주의-이전 시스템에서 실행중인 경우 하위 프로세스 모듈을 사용할 수 없습니다.
Steve Hanov 2011 년

21

하위 프로세스는 popen2를 기반으로하므로 여러 가지 장점 이 있습니다. 여기PEP에 전체 목록이 있지만 일부는 다음과 같습니다.

  • 쉘에서 파이프 사용
  • 더 나은 개행 지원
  • 더 나은 예외 처리

2

Windows에서 python (cpython)을 실행할 때 <built-in function system> os.system_wsystem 커튼 아래에서 실행되고 Windows가 아닌 OS를 사용하는 경우 system을 사용 합니다 .

반대로 Popen 은 Windows 에서는 CreateProcess 를 사용 하고 posix 기반 운영 체제에서는 _posixsubprocess.fork_exec 를 사용해야 합니다.

즉, 중요한 조언은 os.system 문서 에서 나옵니다 .

하위 프로세스 모듈은 새 프로세스를 생성하고 결과를 검색하기위한보다 강력한 기능을 제공합니다. 이 기능을 사용하는 것보다 해당 모듈을 사용하는 것이 좋습니다. 유용한 레시피는 하위 프로세스 문서의 하위 프로세스 모듈로 이전 함수 바꾸기 섹션을 참조하세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.