HOWTO · Python
Python 다른 Python 스크립트 실행
이 자습서는 다른 Python 스크립트에서 Python 스크립트를 실행하는 방법을 보여줍니다.
이 페이지의 내용
같은 Python 프로세스에서 코드를 재사용하려면 모듈에 코드를 넣고 가져오세요. 다른 스크립트를 독립적으로 실행하려면 subprocess로 자식 프로세스를 시작하세요. 함수를 호출하거나 객체를 공유하려면 첫 번째 방법을, 스크립트가 자체 프로세스와 명령줄 동작을 유지해야 한다면 두 번째 방법을 선택하면 됩니다.
import 문으로 다른 Python 스크립트에서 Python 스크립트 실행하기
Python은 모듈을 처음 불러올 때 모듈의 최상위 문을 한 번 실행합니다. 재사용할 작업은 함수에 넣고, 직접 실행할 동작은 if __name__ == "__main__": 아래에 두세요. 그러면 다른 모듈이 파일을 가져오기만 해도 해당 동작이 실행되는 일을 막을 수 있습니다. 모듈 이름을 가져올 때는 .py 확장자를 붙이지 않습니다.
이 독립적인 예제는 임시 디렉터리에 모듈을 만들고, 이를 가져온 다음 함수 호출 방법을 보여 줍니다.
import importlib
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
module_path = Path(folder) / "helper_script.py"
module_path.write_text(
'def greet():\n'
' print("Hello from the helper")\n',
encoding="utf-8",
)
sys.path.insert(0, folder)
try:
helper_script = importlib.import_module("helper_script")
helper_script.greet()
finally:
sys.path.remove(folder)
sys.modules.pop("helper_script", None)
Hello from the helper
프로젝트에서는 호출하는 스크립트와 같은 위치에 보조 모듈을 두거나, 가져올 수 있는 패키지에 포함하세요. 함수와 __main__ 가드 바깥에 있는 문은 가져오는 동안에도 실행됩니다. 따라서 모듈 수준의 작업은 한 번 실행해도 안전한 정의와 설정으로 제한하세요.
execfile() 함수로 다른 Python 스크립트에서 Python 스크립트 실행하기
execfile()은 레거시 함수입니다. 이 함수는 현재 인터프리터에서 파일의 코드를 실행합니다. 오래된 코드에서 볼 수 있지만, 모든 Python 환경에서 사용할 수 있는 것은 아닙니다. 호환성에 유의하고, 사용하기 전에 프로젝트에서 사용하는 인터프리터를 확인하세요. 기본 형태는 execfile("other_script.py")입니다.
Python의 exec()는 지정한 네임스페이스에서 소스 텍스트를 실행할 수 있지만, execfile()을 파일 실행 용도로 그대로 대체하지는 않습니다. 파일을 읽어 그 내용을 exec()에 전달하면 네임스페이스 동작이 달라지며 프로세스도 분리되지 않습니다. 신뢰할 수 없는 소스의 코드를 실행하면 임의의 Python 코드가 실행될 수 있습니다. 재사용할 코드에는 모듈 가져오기를, 별도 프로세스 실행에는 subprocess를 사용하는 편이 좋습니다.
subprocess 모듈로 다른 Python 스크립트에서 Python 스크립트 실행하기
다른 스크립트를 자식 프로세스로 실행하려면 subprocess.run()을 사용하세요. 인수는 리스트로 전달하고, 호출 중인 스크립트와 같은 Python 인터프리터를 선택하려면 sys.executable을 사용합니다. 다음 예제는 작은 자식 스크립트를 만들고 실행한 뒤, 반환 상태를 확인하고 캡처한 출력을 표시합니다.
import subprocess
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
script_path = Path(folder) / "child.py"
script_path.write_text('print("Child process ran")\n', encoding="utf-8")
result = subprocess.run(
[sys.executable, str(script_path)],
check=True,
capture_output=True,
text=True,
)
print(result.stdout, end="")
Child process ran
스크립트 경로를 인수로 전달하세요. 자식 프로세스가 특정 작업 디렉터리에 의존한다면 절대 경로를 사용하거나 cwd를 설정하면 됩니다. 자식 프로세스가 실패 상태로 종료되면 check=True가 CalledProcessError를 발생시킵니다. 호출 측에서 종료 상태를 직접 처리해야 한다면 이 옵션을 생략하고 returncode를 확인하세요. capture_output=True를 사용하면 표준 출력과 표준 오류를 터미널로 보내는 대신 읽을 수 있습니다.
os.system() 함수로 다른 Python 스크립트에서 Python 스크립트 실행하기
os.system()은 명령 문자열을 운영체제 셸에 전달하고 상태 값을 반환합니다. 셸이 문자열을 해석하므로 따옴표 처리와 플랫폼 간 차이를 관리하기 어렵습니다. 신뢰할 수 없는 입력을 이어 붙여 명령을 만들지 마세요. 셸 메타문자가 실행되는 내용을 바꿀 수 있습니다. 새 코드를 작성할 때는 상태를 더 명확히 처리하고 출력을 선택적으로 캡처할 수 있는 subprocess.run()과 인수 리스트를 사용하세요. os.system()은 셸 명령에 이미 의존하는 단순한 레거시 코드를 유지보수할 때 주로 고려하세요.
importlib 모듈로 다른 Python 스크립트에서 Python 스크립트 실행하기
가져올 모듈 이름을 실행 중에 선택하는 경우 importlib.import_module()을 사용하세요. 이 함수는 현재 프로세스에 모듈을 가져오며, 임의의 파일을 별도 프로세스로 실행하지는 않습니다. 모듈을 Python의 가져오기 경로에서 찾을 수 있어야 하며, 처음 가져올 때 모듈의 최상위 문이 실행됩니다.
다음 예제는 가져올 수 있는 모듈을 만들고, 실행 중에 모듈 이름을 선택한 다음 함수를 호출합니다.
import importlib
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
module_path = Path(folder) / "task_module.py"
module_path.write_text(
'def run_task():\n'
' print("Task completed")\n',
encoding="utf-8",
)
sys.path.insert(0, folder)
try:
module_name = "task_module"
task_module = importlib.import_module(module_name)
task_module.run_task()
finally:
sys.path.remove(folder)
sys.modules.pop("task_module", None)
Task completed
모듈 이름이 고정되어 있다면 일반 import가 더 간단합니다. 이름이 실제로 실행 중 설정에 따라 달라질 때 importlib을 사용하고, 애플리케이션에서 가져오도록 허용된 모듈인지 설정값을 검증하세요.
결론
현재 프로세스에서 함수와 데이터를 재사용하려면 import를 사용하고, 다른 스크립트를 독립적으로 실행하려면 subprocess를 사용하세요. importlib은 모듈 이름을 이용한 동적 가져오기를 지원합니다. execfile()은 오래된 코드를 살펴볼 때 마주칠 수 있는 레거시 함수이며, os.system()은 셸을 호출하고 프로세스 제어 기능이 제한적입니다. 새로 별도 프로세스를 실행하는 코드를 작성할 때는 sys.executable과 인수 리스트를 사용하는 subprocess.run()을 권장합니다.