하위 프로세스 Popen과 call의 차이점은 무엇입니까 (어떻게 사용할 수 있습니까)?


178

파이썬에서 외부 프로그램을 호출하고 싶습니다. 나는 모두를 사용하고 Popen()그리고 call()그렇게 할 수 있습니다.

둘의 차이점은 무엇입니까?

내 구체적인 목표는 Python에서 다음 명령을 실행하는 것입니다. 리디렉션이 어떻게 작동하는지 잘 모르겠습니다.

./my_script.sh > output

나는 설명서를 읽었 으며 그것이 call()편의 기능 또는 단축 기능 이라고 말합니다 . call()대신 에 사용하면 전원이 끊어 Popen()집니까?


설명서의 어떤 부분이 혼란 스럽습니까? 의 정의는 call()매우 분명한 것 같습니다. 답변에 중점을 둘 것을 알 수 있도록 견적이나 링크를 제공 할 수 있습니까?
S.Lott

답변:


265

리디렉션을 수행하는 두 가지 방법이 있습니다. 둘 다 subprocess.Popen또는에 적용됩니다 subprocess.call.

  1. 키워드 인수를 설정 shell = True하거나 executable = /path/to/the/shell명령을 그대로 지정하십시오.

  2. 출력을 파일로 리디렉션하기 때문에 키워드 인수를 설정하십시오.

    stdout = an_open_writeable_file_object

    객체가 output파일을 가리키는 위치 .

subprocess.Popen보다 일반적 subprocess.call입니다.

Popen차단하지 않으므로 프로세스가 실행되는 동안 프로세스와 상호 작용하거나 Python 프로그램의 다른 작업을 계속할 수 있습니다. 호출 PopenPopen객체 를 반환 합니다.

call 않는 블록을. Popen생성자 와 동일한 인수를 모두 지원 하므로 프로세스의 출력, 환경 변수 등을 계속 설정할 수 있지만 스크립트는 프로그램이 완료 될 때까지 대기 call하고 프로세스의 종료 상태를 나타내는 코드를 반환합니다.

returncode = call(*args, **kwargs) 

기본적으로 전화와 동일

returncode = Popen(*args, **kwargs).wait()

call편리한 기능 일뿐입니다. CPython의 구현은 subprocess.py에 있습니다 .

def call(*popenargs, timeout=None, **kwargs):
    """Run command with arguments.  Wait for command to complete or
    timeout, then return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])
    """
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

보시다시피 주위에 얇은 래퍼 Popen입니다.


17
기본적으로 Popen과 call은 각각 Linux 명령을 실행하는 비동기 및 동기 함수입니다.
user3016020

1
popen을 사용하면 어떤 이점이 있습니까? 호출 된 프로그램이 먼저 완료 될 때까지 기다리는 것이 안전하지 않습니까?
Tom

4
@Tom 종종 아닙니다. 일부 출력을 읽은 다음 프로그램에 더 많은 입력을 보내고 해당 입력의 결과로 더 많은 출력을 읽고 반복하려면 어떻게해야합니까?
agf

@ user3016020 이것이 Windows 명령에도 적용된다고 가정합니까? 권리?
domih

7

다른 대답은 매우 완벽하지만 여기에 경험이 있습니다.

  • call 차단 중입니다.

    call('notepad.exe')
    print('hello')  # only executed when notepad is closed
  • Popen 비 차단입니다.

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