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

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

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

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

./my_script.sh > output

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



답변

리디렉션을 수행하는 두 가지 방법이 있습니다. 둘 다 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입니다.


답변

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

  • call 차단 중입니다.

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

    Popen('notepad.exe')
    print('hello')  # immediately executed

답변