PyInstaller 패키징 시 "모듈을 찾을 수 없음" 오류 해결 방법
1. 개요
PyInstaller를 사용하여 Python 프로젝트를 실행 파일(EXE)로 패키징할 때, 특정 모듈을 찾을 수 없다는 오류가 발생할 수 있습니다. 이러한 문제는 여러 가지 원인으로 인해 발생하며, 해결 방법도 다양합니다.
이 글에서는 "ModuleNotFoundError"가 발생하는 주요 원인과 해결 방법을 단계별로 설명하고, 초보자도 쉽게 따라 할 수 있도록 예제 코드와 실용적인 팁을 제공하겠습니다.
2. 오류의 원인
PyInstaller 패키징 시 모듈을 찾지 못하는 대표적인 원인은 다음과 같습니다.
원인 | 설명 |
1. 숨겨진(import되지 않은) 모듈 | 코드에서 동적으로 불러오는 모듈(예: importlib.import_module)이 PyInstaller에서 감지되지 않음 |
2. 패키징 옵션 설정 문제 | pyinstaller 실행 시 필요한 옵션을 추가하지 않아서 발생 |
3. 가상환경 문제 | 가상환경에서 설치된 패키지가 패키징 과정에서 누락됨 |
4. 경로 문제 | 실행 파일이 필요한 모듈을 올바르게 찾지 못하는 경우 |
5. PyInstaller의 hook 미지원 | 특정 라이브러리에 대한 PyInstaller의 자동 감지 기능 부족 |
3. 해결 방법
위에서 언급한 원인별로 해결 방법을 정리하면 다음과 같습니다.
3.1 숨겨진 모듈 처리
PyInstaller는 코드에서 직접 import한 모듈만 자동으로 감지합니다. 하지만 동적으로 불러오는 모듈(예: importlib.import_module)은 감지하지 못하므로, --hidden-import 옵션을 사용해야 합니다.
pyinstaller --onefile --hidden-import=my_module my_script.py
또는 spec 파일을 수정하여 추가할 수도 있습니다.
# my_script.spec 파일 수정
hiddenimports=['my_module'],
3.2 패키징 옵션 설정 문제 해결
PyInstaller 실행 시 필요한 옵션을 확인하고 추가합니다.
- 단일 실행 파일 생성: --onefile
- 콘솔 출력 숨기기(윈도우 GUI 앱): --noconsole
- 모듈 누락 방지: --hidden-import=모듈명
- 추가적인 데이터 파일 포함: --add-data="source:destination"
예제 실행 명령:
pyinstaller --onefile --noconsole --hidden-import=my_module my_script.py
3.3 가상환경 문제 해결
패키징 전에 가상환경을 활성화한 후, 해당 환경에서 PyInstaller를 실행합니다.
python -m venv myenv
source myenv/bin/activate # (Windows의 경우 myenv\Scripts\activate)
pip install -r requirements.txt
pyinstaller --onefile my_script.py
3.4 실행 파일의 경로 문제 해결
실행 파일이 필요한 모듈을 찾지 못하는 경우, 실행 환경을 확인합니다.
- 현재 디렉토리에서 실행하는지 확인 (cd 명령 사용)
- sys.path를 출력하여 모듈이 올바른 경로에 있는지 확인
- --add-data 옵션을 사용하여 필요한 리소스를 포함
예제 코드:
import sys
print(sys.path) # 실행 시 포함된 경로 확인
3.5 PyInstaller의 hook 미지원 해결
특정 라이브러리는 PyInstaller의 자동 감지 기능이 부족할 수 있습니다. 이 경우 PyInstaller의 hook을 수동으로 추가해야 합니다.
- PyInstaller/hooks/hook-모듈이름.py 파일 생성
- 필요한 모듈을 명시적으로 추가
예제 (hook-mymodule.py 파일 생성):
from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('mymodule')
그 후 다시 pyinstaller 명령을 실행합니다.
4. 예제 코드 및 실행 방법
아래는 importlib을 사용하여 동적으로 모듈을 불러올 때 발생할 수 있는 오류를 해결하는 예제입니다.
4.1 문제 코드
import importlib
def load_module(module_name):
return importlib.import_module(module_name)
module = load_module("my_module") # 패키징 시 누락 가능성 있음
print(module)
4.2 해결 방법 적용
PyInstaller 실행 시 --hidden-import 옵션 추가:
pyinstaller --onefile --hidden-import=my_module my_script.py
또는 spec 파일 수정:
hiddenimports=['my_module'],
5. 결론
PyInstaller를 사용할 때 모듈을 찾을 수 없는 오류가 발생하는 원인은 다양하지만, 대부분의 경우 다음 방법으로 해결할 수 있습니다.
✅ --hidden-import 옵션을 활용하여 숨겨진 모듈 포함하기
✅ spec 파일을 수정하여 모듈을 명시적으로 추가하기
✅ 가상환경에서 패키징하여 필요한 패키지가 누락되지 않도록 하기
✅ 실행 파일의 경로 문제를 해결하기
✅ PyInstaller hook을 활용하여 자동 감지되지 않는 모듈 추가하기
'코딩취미 > Python' 카테고리의 다른 글
파이썬에서 안전하게 멀티스레드 생성 및 관리하기(QThreadPool, QRunnable) (0) | 2025.02.28 |
---|---|
파이썬에서 안전하게 스레드 멈추기 (0) | 2025.02.28 |
PySide6로 파일 이동 및 압축하기 – ZIP, TAR, 7Z 압축을 활용한 GUI 프로그램 제작 (0) | 2025.02.27 |
[파이썬, pyside6] MD5 해시란? MD5 해시를 생성하고 비교하는 방법 (0) | 2025.02.27 |
PySide6 QTabBar 완전 정복 – 탭 추가 감지 및 사용법 (0) | 2025.02.26 |