Python 모듈은 단일 파일로 캡슐화할 수 있을까?
결론부터 말하자면, 일반적으로 Python 모듈을 하나의 파일에 캡슐화하는 것은 불가능합니다. 그 이유는 Python이 파일과 디렉터리 구조를 기반으로 모듈을 검색하는 방식을 사용하기 때문입니다. 모듈을 단일 파일로 합쳐버리면 이 검색 메커니즘이 깨지게 됩니다.
설치 권한이 없는 경우의 대안
권한 부족 등의 이유로 시스템에 모듈을 설치할 수 없다면, 두 가지 대안이 있습니다.
- 모듈 파일들을 별도 디렉터리에 저장한 뒤
sys.path에 해당 경로를 추가하기 - virtualenv를 사용해 격리된 로컬 Python 환경 구성하기
1. sys.path에 모듈 경로 추가하기
모듈 파일을 다른 디렉터리에 저장하고, 아래 코드처럼 sys.path에 경로를 추가하면 Python이 해당 폴더에서도 모듈을 검색합니다.
>>> import os, sys
>>> file_path = 'AdditionalModules/'
>>> sys.path.append(os.path.dirname(file_path))
>>> # PYTHONPATH에 추가되었으므로 이제 Python도 AdditionalModules 폴더에서 모듈을 가져옵니다.
2. virtualenv로 격리된 환경 만들기
virtualenv를 사용하면 격리된 로컬 Python 환경을 만들 수 있습니다. 이 도구가 해결하는 근본적인 문제는 의존성과 버전 충돌이며, 간접적으로는 권한 문제이기도 합니다.
예를 들어 한 애플리케이션은 LibFoo 버전 1이 필요하고, 다른 애플리케이션은 버전 2가 필요하다고 가정해봅시다. 두 애플리케이션을 어떻게 함께 사용할 수 있을까요? 모든 패키지를 /usr/lib/python2.7/site-packages(또는 플랫폼의 표준 위치)에 설치하면, 업그레이드하면 안 되는 애플리케이션을 실수로 업그레이드하는 상황이 발생하기 쉽습니다.
또한 이 방법은 설치 권한이 없어 시스템에 패키지를 설치할 수 없는 상황에서도 유용하게 활용할 수 있습니다.
virtualenv에 대한 자세한 내용은 공식 문서(https://virtualenv.pypa.io/en/stable/)를 참고하세요.