소개
모듈 다루기는 파이썬 프로그래밍에서 필수적이다. 모듈은 파이썬 정의와 명령어를 담은 파일이다. 어떤 파이썬 파일(.py)이라도 모듈이 될 수 있다. 개발을 하는 과정에서는, 때때로 다른 디렉토리에서 모듈을 가져와야 할 필요가 있다. 이는 코드를 여러 디렉토리에 조직적으로 관리해야 하는 큰 프로젝트에서 유용하다. 이 섹션에서는 파이썬에서 다른 디렉토리의 모듈을 어떻게 가져오는지 알아보는데, 시스템 경로를 수정하거나 상대 경로를 사용하는 방법을 포함해 여러 방법을 다룬다.
모듈 임포트 방법
파이썬 프로젝트를 작업할 때, 종종 다른 모듈이나 패키지의 코드를 사용해야 할 수 있다. 모듈의 코드를 사용하려면 현재 파이썬 스크립트에 그 모듈을 가져와야 한다. 파이썬에는 스크립트에 모듈을 가져올 수 있게 해주는 import라는 내장 함수가 있다. 모듈을 가져오려면 import 키워드 뒤에 모듈 이름을 적으면 된다.
import my_module
이렇게 하면 my_module 모듈이 스크립트로 가져와져서 그 안의 모든 함수와 변수를 사용할 수 있게 된다. 하지만 가끔은 원하는 모듈이 현재 스크립트와 다른 디렉토리에 위치할 수 있다. 이 경우, 모듈의 경로를 절대 경로나 상대 경로로 지정해야 한다. 절대 경로는 파일 시스템상에서 모듈의 전체 경로를 지정한다. 예를 들면 다음과 같다.
import sys
sys.path.append('/path/to/other/directory')
import my_module
이렇게 하면 my_module이 포함된 디렉토리가 Python이 모듈을 검색하는 디렉토리 목록에 추가된다.
상대 경로는 현재 스크립트에 대한 모듈의 경로를 지정한다. 예를 들어:
from ..other_directory import my_module
이렇게 하면 my_module을 현재 디렉토리보다 한 단계 위 디렉토리에서 가져온다.
요약하자면, 파이썬에서 모듈을 가져오는 것은 import 키워드 다음에 모듈 이름을 사용하여 수행된다. 모듈이 현재 스크립트와 다른 디렉토리에 위치한 경우, 절대 경로나 상대 경로를 사용하여 위치를 지정할 수 있다.
모듈 내에서 특정 함수나, 객체만 참조하고자 하는 경우 다음과 같이 이용할 수 있다.
from my_module import my_function
모듈을 가져온 후 특정 이름으로 치환하여 이용하고자 하는 경우 다음과 같이 이용할 수 있다.
import my_module as mm
다른 디렉토리의 모듈 임포트 방법
sys.path.append()
파이썬의 import 문은 프로젝트의 다른 모듈이나 파일에서 코드를 사용할 수 있게 해준다. 하지만 가끔 현재 작업 디렉토리와 다른 디렉토리에 저장된 모듈을 가져와야 할 때가 있다. 이런 경우에는 sys.path.append() 메소드를 사용해 해당 모듈이 있는 디렉토리 경로를 파이썬의 검색 경로에 추가할 수 있다.
다음은 sys.path.append()를 사용해 다른 디렉토리에서 모듈을 가져오는 예제이다:
import sys
sys.path.append('/path/to/directory')
import my_module
이 예제에서는 먼저 sys 모듈을 가져온 다음 path.append() 메소드를 사용하여 우리 모듈이 포함된 디렉토리의 경로를 파이썬의 검색 경로에 추가한다. 그 후에는 평소와 같이 모듈 이름을 사용하여 모듈을 가져올 수 있다.
sys.path.append()는 지정된 디렉토리를 파이썬의 검색 경로 맨 끝에 추가한다는 점을 주목할 필요가 있다. 이는 동일한 이름의 모듈이 여러 디렉토리에 있을 경우, 파이썬은 검색 경로에서 처음 나타나는 디렉토리의 모듈을 사용한다는 의미다. 따라서 파이썬의 검색 경로에 디렉토리를 추가하는 순서를 신중하게 고려해야 한다.
또한 sys.path.append()를 사용하면 코드의 이식성이 떨어질 수 있으므로, 가능한 한 코드 내에 파일 경로를 하드 코딩하는 것을 피하는 것이 좋다.
전반적으로 sys.path.append()를 사용하여 다른 디렉토리에서 모듈을 가져오는 것은 여러 모듈과 파일이 있는 큰 프로젝트를 작업할 때 유용한 기술일 수 있다.
PYTHONPATH Environment Variable
가끔 메인 파이썬 스크립트가 위치한 디렉토리와 다른 디렉토리에 있는 모듈을 가져와야 할 수 있다. 이런 경우 PYTHONPATH 환경 변수를 사용하여 모듈을 가져올 디렉토리 경로를 지정할 수 있다.
PYTHONPATH 환경 변수는 모듈을 가져올 때 파이썬이 검색하는 디렉토리 목록이다. 모듈을 가져올 때 파이썬은 먼저 현재 디렉토리를 검색한 다음, PYTHONPATH 변수에 나열된 모든 디렉토리를 검색한다.
다음은 파이썬 스크립트 내에서 PYTHONPATH 환경 변수를 설정하는 예제이다:
import os
import sys
# Add the directory containing your module to the Python path (before importing it)
module_dir = os.path.abspath('/path/to/module_directory')
sys.path.insert(0, module_dir)
# Now you can import your module as usual
import my_module
이 예제에서는 먼저 나중에 필요한 os와 sys 모듈을 가져온다. 그 다음, 우리 모듈이 있는 디렉토리의 절대 경로를 정의하고 sys.path.insert()를 사용해 sys.path 목록의 맨 앞에 추가한다. 마지막으로, 평소처럼 import my_module을 사용하여 모듈을 가져온다.
모듈 디렉토리를 sys.path의 맨 앞에 추가하는 것은 중요하다. 이는 파이썬이 sys.path의 위치에 따라 우선 순위를 두고 모듈을 검색하기 때문이다. 우리 모듈 디렉토리를 위치 0에 추가함으로써, 다른 디렉토리보다 높은 우선 순위를 부여한다.
PYTHONPATH 환경 변수를 사용하는 것은 다른 디렉토리에서 모듈을 가져오는 편리한 방법이다, 특히 여러 하위 디렉토리가 있는 큰 프로젝트에서 작업할 때 유용하다. 하지만 sys.path를 직접 수정하는 것은 의도치 않은 결과를 초래하고 디버깅하기 어려운 문제를 일으킬 수 있으므로, 가상 환경이나 pipenv, poetry와 같은 패키지 관리자를 사용하여 의존성을 관리하고 잠재적인 충돌을 피하는 것이 권장된다.
Relative Import
파이썬 프로젝트를 진행하다 보면, 여러 디렉토리에 다양한 모듈이 포함될 수 있다. 때로는 현재 스크립트가 위치한 디렉토리가 아닌 다른 디렉토리에서 모듈을 가져와야 할 수도 있다.
이를 위해 상대 경로를 사용하는 import 문을 사용할 수 있다. 상대 경로 import 문은 현재 스크립트 위치에 대한 모듈의 위치를 지정한다.
예를 들어, directory1과 directory2라는 두 디렉토리가 있다고 가정하고, directory1에서 module1.py 모듈을 directory2에 위치한 스크립트로 가져오려면 다음과 같은 상대 경로 import 문을 사용할 수 있다:
from ..directory1 import module1
이 예제에서 이중 점(..)은 directory1에 접근하기 전에 디렉토리 계층에서 한 단계 위로 올라가고 싶다는 것을 나타낸다.
상대 경로 가져오기는 패키지 내에서만 작동한다는 점을 알아두는 것이 중요하다. 패키지는 __init__.py라는 추가 파일이 포함된 디렉토리를 의미한다. 이 __init__.py 파일은 비어 있거나 패키지의 초기화 코드를 포함할 수 있다.
모듈과 패키지를 구성하는 방법
다음과 같은 예제를 생각해보자.
하나의 패키지 내부에 두 개의 디렉터리가 있고, 각 디렉터리에 모듈이 하나씩 들어있다. 그리고 이 모듈들은 서로를 참조하고 있다.
mypackage
├── main.py
├── __init__.py
└── directory1
└── module1.py
└── directory2
└── module2.py
이 문제를 해결하기 위해 먼저 이중점(..)을 이용하여 각 모듈이 서로를 참조하도록 할 수 있을 것이다. 외부에서 이 패키지를 사용하는 경우에는 문제없이 잘 동작할 것이다. 하지만 main.py에서 모듈을 이용하려는 경우 문제가 생길 수 있다. 이중점(..)이 루트 디렉터리를 벗어날 수 없기 때문에 생기는 문제이다.
이런 경우, __init__.py에 현재 패키지 디렉터리를 추가하여 해결하는 방법이 있다.
import sys
sys.path.append('/path/to/directory')
import my_module
이렇게 하면, main.py에서도 내부 모듈을 이용할 수 있고, 외부 프로젝트에서도 모듈 임포트 코드 변경 없이 패키지를 이용할 수 있다.
추가 내용
'프로그래밍 > Python' 카테고리의 다른 글
[Python] PyInstaller, PyArmor를 이용한 파이썬 패키징 (0) | 2024.08.15 |
---|---|
[Python] literal_eval을 이용한 외부 python 파일 읽기 (0) | 2024.08.15 |