runpy 모듈이란?
파이썬 명령줄 옵션 중 -m 옵션은 지정된 모듈을 검색한 뒤 이를 __main__ 모듈로서 실행합니다. 이 메커니즘은 내부적으로 파이썬 표준 라이브러리의 runpy 모듈이 담당하며, 파일 시스템 경로가 아닌 파이썬 모듈 네임스페이스를 기준으로 스크립트를 찾아 실행할 수 있도록 해 줍니다.
runpy 모듈은 두 가지 핵심 함수를 제공합니다.
run_module()
이 함수는 지정된 모듈의 코드를 실행하고, 그 결과로 생성되는 모듈의 전역(globals) 딕셔너리를 반환합니다.
- mod_name 인수에는 절대(absolute) 모듈 이름을 지정해야 합니다.
- 모듈 이름이 일반 모듈이 아닌 패키지를 가리키는 경우, 해당 패키지가 먼저 임포트된 후 패키지 내부의
__main__서브모듈이 실행되며, 그 결과 전역 딕셔너리가 반환됩니다.
모듈 코드가 실행되기 전에 특수 전역 변수인 __name__, __spec__, __file__, __cached__, __loader__, __package__가 전역 딕셔너리에 설정됩니다.
__name__: 지정된 모듈이 패키지라면mod_name + '.__main__'으로, 그렇지 않으면mod_name으로 설정됩니다.__file__,__cached__,__loader__,__package__: 모듈 스펙(module spec)에 따라 일반적인 방식으로 설정됩니다.
run_path()
이 함수는 주어진 경로에 있는 파일의 코드를 실행하고 결과 전역 딕셔너리를 반환합니다. 경로는 파이썬 소스 파일, 컴파일된 바이트코드 파일, 또는 __main__ 모듈을 포함하는 유효한 sys.path 항목(예: 최상위 __main__.py 파일을 담고 있는 zip 파일)을 가리킬 수 있습니다.
모듈 코드가 실행되기 전에 앞서 언급한 특수 전역 변수들이 전역 딕셔너리에 설정됩니다.
__name__: 선택적 인수run_name이 None이 아니면 그 값으로, None이면'<run_path>'로 설정됩니다.
예제
다음 스크립트를 runpyexample.py라는 이름으로 저장합니다.
#runpy 예제
def add(x,y):
return x+y
def main():
x,y = 10,20
print(add(x,y))
return
if __name__=='__main__':
main()일반적으로 위 예제를 실행하려면 모듈을 임포트한 후 main() 함수를 직접 호출해야 합니다.
>>> import runpyexample as rp >>> rp.main() 30 >>>
그러나 runpy 모듈을 활용하면 임포트 과정 없이 곧바로 모듈을 실행할 수 있습니다.
>>> import runpy
>>> runpy.run_module('runpyexample', run_name='__main__')
30run_path() 함수를 사용하는 방법도 있습니다.
>>> runpy.run_path('runpyexample.py', run_name='__main__')
30앞서 설명했듯이 runpy 모듈은 파이썬 명령줄의 -m 스위치를 지원합니다.
E:\python37>python -m runpyexample 30
정리
runpy 모듈은 모듈을 파일 경로가 아닌 모듈 이름 기준으로 찾아 실행할 수 있게 해 주는 표준 라이브러리입니다. 실무에서는 python -m 모듈명 형태로 널리 사용되며, zipapp처럼 실행 가능한 아카이브를 만들거나 모듈을 동적으로 로드·실행해야 하는 도구를 개발할 때 특히 유용합니다.