파이썬에서 외부 프로그램을 호출하고 싶습니다. 나는 모두를 사용하고 Popen()
그리고 call()
그렇게 할 수 있습니다.
둘의 차이점은 무엇입니까?
내 구체적인 목표는 Python에서 다음 명령을 실행하는 것입니다. 리디렉션이 어떻게 작동하는지 잘 모르겠습니다.
./my_script.sh > output
나는 설명서를 읽었 으며 그것이 call()
편의 기능 또는 단축 기능 이라고 말합니다 . call()
대신 에 사용하면 전원이 끊어 Popen()
집니까?
답변
리디렉션을 수행하는 두 가지 방법이 있습니다. 둘 다 subprocess.Popen
또는에 적용됩니다 subprocess.call
.
-
키워드 인수를 설정
shell = True
하거나executable = /path/to/the/shell
명령을 그대로 지정하십시오. -
출력을 파일로 리디렉션하기 때문에 키워드 인수를 설정하십시오.
stdout = an_open_writeable_file_object
객체가
output
파일을 가리키는 위치 .
subprocess.Popen
보다 일반적 subprocess.call
입니다.
Popen
차단하지 않으므로 프로세스가 실행되는 동안 프로세스와 상호 작용하거나 Python 프로그램의 다른 작업을 계속할 수 있습니다. 호출 Popen
은 Popen
객체 를 반환 합니다.
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