본문 바로가기
  • 우당탕탕속의 잔잔함
Programming/Error, Language, Environments

[Pyinstaller] ModuleNotFoundError 문제 해결방법

by zpstls 2023. 3. 14.
반응형

Pyinstaller를 통해 EXE 파일을 생성하였을 때 Module을 찾을 수 없다는 Error가 발생되곤 합니다.

이번 포스트는 이를 해결하는 몇 가지 방법에 대해 다루고자 합니다.

 

 

Prompt 환경에서 Python Script를 실행하였을 때는 문제없이 프로그램이 정상적으로 수행되었지만, Pyinstaller를 통해 EXE 파일로 추출한 후 해당 프로그램을 실행하면 Module을 찾을 수 없다는 Error Message를 받게 되면서 정상적인 실행이 되지 않는 문제가 꽤 자주 발생됩니다.

ModuleNotFound

위와 같이 Module을 찾을 수 없다는 Error가 발생되면 다음과 같은 방식으로 해결해 볼 수 있습니다.

 

1. Pyinstaller의 버전을 업그레이드 시켜줍니다.

최신 버전을 사용하게 되면 이전에는 찾지 못했던 모듈을 찾게 되는 경우가 있습니다. 따라서 아래와 같은 명령어를 통해 최신 버전을 사용해 봅니다.

>> pip install --upgrade pyinstaller

2023년 03월 기준으로 5.8.0 버전이 최신 버전입니다. 이렇게 했음에도 해결되지 않는다면 다음 2번 해결 과정을 수행해 봅니다.

 

 

2. .spec 파일에 hiddenimports를 추가해 줍니다.

hiddenimports 부분에, import A와 같이 사용되는 모듈은 A라고 적어주고, from A import B로 사용되는 모듈은 A.B로 적어줍니다. 이렇게 했음에도 해결되지 않는다면 다음 3번 해결 과정을 수행해 봅니다.

 

 

3. hook 파일을 사용합니다.

"hook" 파일은 PyInstaller를 확장하여 Python 패키지에서 사용하는 특별한 요구 사항과 메서드를 사용할 수 있도록 하는 것입니다.

우선, .spec File에 다음과 같이 hook 파일이 저장되는 Directory 경로를 적어줍니다.

‘extra-hooks’ Directory에는 다음과 같은 파일들을 생성해 놓습니다.

위 이미지의 빨간 밑줄 부분을 Module Name으로 교체해서 사용하면 됩니다.

 

 

 

 

보통의 경우, 여기까지 수행하면 해결됩니다.

그러나 언제나 그러하듯... 3번까지 수행했음에도 해결되지 않을 수도 있습니다.ㅠㅠ

 

여러 상황이 발생하겠지만, 보통 다음과 같은 새로운 Error Message가 뜰 가능성이 높습니다.

lazy-loader Error

위와 같은 Error는, Pyinstaller-frozen에서는 byte로 컴파일된 pyc를 수집해 사용하지만 librosa에서는 stub file명을 지정해 줄 때 naive 하게 지정해 주기 때문에 발생되는 Error입니다. 즉 __file__이 pyc를 포함하고 있도록 만들어주면 해결됩니다. 다음과 같이 크게 2가지 해결 방법이 있습니다.

 

1. lazy-loader를 업그레이드해줍니다.

최근 업데이트된 버전에서 naive 한 filename 구조에서 발생되는 문제를 해결했다고 합니다. 따라서 다음과 같은 방법을 통해 lazy-loader의 최신 버전을 사용해 봅니다.

>> pip uninstall lazy-loader
>> pip install git+https://github.com/scientific-python/lazy_loader

만일 이 방법을 수행했음에도 해결되지 않는다면 2번 과정을 수행해 봅니다.

 

 

2. lazy-loader 부분의 코드를 수정합니다.

Error가 발생하는 Module의 __init__.py의 코드를 위와 같이 수정해 줍니다. 그리고 앞서 3번 과정처럼 hook 부분을 설정해 주고 pyinstaller를 실행시킵니다.

 

 

위와 같은 방법을 수행해 보면, 아마도(?) Module을 찾지 못해 발생하는 문제는 대부분 해결되지 않을까 싶습니다.

물론... 아닐 수도 있습니다...ㅠㅠ

원만한 해결이 되셨기를 바라며, 이번 포스트는 여기서 마무리하도록 하겠습니다.

반응형

댓글