HOWTO · Python
Python의 다른 파일에서 변수 가져오기
이 자습서는 Python의 다른 파일에서 변수를 가져오는 방법을 보여줍니다.
이 페이지의 내용
다른 Python 파일에 정의된 변수를 사용하려면 모듈을 가져온 뒤 변수에 접근하거나, from module import name으로 이름을 직접 가져오면 됩니다. 해당 모듈은 Python의 가져오기 경로에서 찾을 수 있어야 합니다. 작은 프로젝트라면 두 파일을 같은 디렉터리에 두고 그 프로젝트에서 가져오는 스크립트를 실행하세요.
from ... import ...로 특정 이름 가져오기
config.py에 greeting = "Hello, World!"가 정의되어 있다고 가정해 보겠습니다. 가져오는 파일에서 from config import greeting을 사용하면 greeting을 직접 참조할 수 있습니다. 모듈 이름은 .py를 뺀 파일 이름입니다. 이 방식은 몇 개의 이름만 필요할 때 편리합니다. 쉼표로 구분해 여러 이름을 한 번에 가져올 수도 있습니다. 예를 들어 from config import greeting, language처럼 작성합니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import sys
with TemporaryDirectory() as directory:
project = Path(directory)
(project / "config.py").write_text('greeting = "Hello, World!"\n', encoding="utf-8")
sys.path.insert(0, str(project))
from config import greeting
print(greeting)
이 예제는 런타임 코디네이터가 실행하도록 제공된 것입니다. 이 작성 패킷에는 실행 결과가 포함되어 있지 않습니다.
모듈을 가져와 변수에 접근하기
사용할 때마다 원본 모듈을 드러내고 싶다면 import config를 사용한 다음 config.greeting에 접근하세요. 모듈 접두사를 붙이면 이름의 출처가 분명해지고, 서로 다른 모듈에 같은 이름이 정의되어 있을 때 이름 충돌을 줄일 수 있습니다. 일반적인 가져오기는 가져오기가 실행될 때 가져온 이름에도 값을 바인딩합니다. 따라서 원본 모듈에서 나중에 값을 바꿔도 별도로 가져온 이름이 그 값을 실시간으로 참조하지는 않습니다.
importlib으로 모듈을 동적으로 가져오기
설정이나 사용자 선택에 따라 모듈 이름이 실행 중에 결정될 때는 importlib을 사용하세요. 모듈 이름이 이미 정해져 있다면 일반적인 가져오기가 더 짧고 이해하기 쉽습니다. 별도의 설정 없이 사용할 수 있는 동적 가져오기 방식은 다음과 같습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import importlib
import sys
with TemporaryDirectory() as directory:
project = Path(directory)
(project / "config.py").write_text('greeting = "Hello, World!"\n', encoding="utf-8")
sys.path.insert(0, str(project))
module_name = "config"
module = importlib.import_module(module_name)
print(module.greeting)
importlib.import_module()은 모듈 객체를 반환하므로, 그 객체를 통해 변수에 접근합니다. 가져오기 시스템에서 해당 모듈을 찾을 수 있어야 한다는 점은 같습니다.
다른 디렉터리에 있는 모듈을 가져올 수 있게 만들기
Python은 임의의 파일을 검색하는 것이 아니라 가져오기 경로에 있는 디렉터리를 검색합니다. 간단한 디렉터리 구조는 project/main.py와 project/settings/config.py를 나란히 두는 것입니다. settings.config를 가져올 수 있는지는 스크립트를 실행하는 위치와 패키지 설정에 따라 달라집니다. 일반 패키지라면 필요한 위치에 __init__.py를 추가하고 from settings.config import greeting처럼 패키지 이름을 사용하세요. 다른 디렉터리에서 실행하면 Python이 검색하는 위치가 달라질 수 있으므로, 프로젝트를 일관된 방법으로 실행하는 편이 좋습니다.
독립 실행형 스크립트에서 다른 방법이 필요할 때는 최후의 수단으로 가져오기 전에 모듈이 들어 있는 디렉터리를 sys.path에 추가할 수 있습니다. 가능하면 현재 작업 디렉터리만 가정하지 말고 안정적인 위치를 기준으로 해당 디렉터리를 지정하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import sys
with TemporaryDirectory() as directory:
project = Path(directory)
settings_directory = project / "settings"
settings_directory.mkdir()
(settings_directory / "config.py").write_text('greeting = "Hello, World!"\n', encoding="utf-8")
sys.path.insert(0, str(settings_directory))
from config import greeting
print(greeting)
이 코드는 모듈 파일 자체가 아니라 디렉터리를 sys.path에 추가합니다. 유지 관리할 애플리케이션에서는 애플리케이션 코드에서 가져오기 경로를 변경하는 것보다 패키지 가져오기나 설치된 패키지를 사용하는 편이 대개 관리하기 쉽습니다.
예제 실행 및 문제 해결
가져오기에서 사용하는 이름과 대소문자까지 정확히 일치하도록 모듈 파일을 저장하고, 변수는 모듈 최상위 수준에 정의되어 있는지 확인하세요. Python에서 ModuleNotFoundError가 발생하면 파일 이름, 디렉터리 구조, 스크립트를 실행한 방법, 모듈이 들어 있는 디렉터리가 가져오기 경로에 포함되어 있는지 확인하세요. 특정 이름에 대해 ImportError가 발생한다면 모듈에 정의된 이름과 철자가 일치하는지 살펴보세요. 직접 만든 파일의 이름을 표준 라이브러리 모듈과 같게 짓지 마세요. 그러면 Python이 의도와 다른 모듈을 불러올 수 있습니다.
의존 모듈이 정해져 있다면 일반적인 가져오기가 가장 적합합니다. 소수의 이름에 간결하게 접근하려면 from config import greeting을 사용하고, 모듈 네임스페이스를 드러내는 편이 더 명확하다면 import config를 선택하세요. 모듈 이름이 실제로 런타임 데이터에 따라 달라질 때는 importlib을 사용합니다.