2021년 10월 4일 월요일

python subprocess call,Popen,run 차이 (call,Popen,run difference)

python의 subprocess 를 사용할때 call, run, Popen 을 사용하게 되는데 차이점을 알아야 뭘쓸지 결정하게 됩니다.

이런 시리즈도 많고, 암튼 외부 프로세서를 실행시키는 시리즈가 많은데... 이번에 저 3가지 차이점을 알면 저것만 사용하면 되겠습니다.

os.execl(path, arg0, arg1, ...)

os.execle(path, arg0, arg1, ..., env)

os.execlp(file, arg0, arg1, ...)

os.execlpe(file, arg0, arg1, ..., env)

os.execv(path, args)

os.execve(path, args, env)

os.execvp(file, args)¶

os.execvpe(file, args, env)


동작 차이 비교

import subprocess

# call is blocking:
subprocess.call('notepad.exe')
print("subprocess.call('notepad.exe')") # executed when notepad is closed

# run is blocking:
subprocess.run('notepad.exe')
print("subprocess.run('notepad.exe')") # executed when notepad is closed

# Popen is non-blocking:
subprocess.Popen('notepad.exe')
print("subprocess.Popen('notepad.exe')") # immediately executed

위 코드 한번 실행시키면서 결과를 보면 확연하게 하나가 동작이 다름을 알 수 있습니다.

그렇습니다. Popen만 실행하자 마자 화면이 출력됩니다. 즉 non-blocking 방식이 됩니다.

call, run의 차이는 뭘까요?


python 3.5 이전에는 call 만 사용이 되었고 call의 인자를 보면 인자가 조촐합니다.

subprocess.call(args*stdin=Nonestdout=Nonestderr=Noneshell=Falsecwd=Nonetimeout=None**other_popen_kwargs)


run()이 가장 최신입니다. 3.5부터 이용할 수 있으며 사용가능한 인자도 많이 늘었습니다.

subprocess.run(args*stdin=Noneinput=Nonestdout=Nonestderr=Nonecapture_output=Falseshell=Falsecwd=Nonetimeout=Nonecheck=Falseencoding=Noneerrors=Nonetext=Noneenv=Noneuniversal_newlines=None**other_popen_kwargs)


call 인자들은 run에서 모두 가지고 있습니다. 그래서 python 3.5 이상을 사용하신다면 call 대신 run을 사용하면 되겠습니다.




댓글 없음:

댓글 쓰기