본문 바로가기

프로그래밍/Python

[Python] ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.

반응형

파이썬을 사용하면서 종종 패키지를 import 하는 부분 등에서 다음과 같은 메시지가 발생한다.

>>> from kivy.app import App
 Traceback (most recent call last):
   File "<pyshell#1>", line 1, in <module>
     from kivy.app import App
   File "D:\Python3464\lib\site-packages\kivy\app.py", line 327, in <module>
     from kivy.uix.widget import Widget
   File "D:\Python3464\lib\site-packages\kivy\uix\widget.py", line 219, in <module>
     from kivy.graphics import (
   File "D:\Python3464\lib\site-packages\kivy\graphics\__init__.py", line 89, in <module>
     from kivy.graphics.instructions import Callback, Canvas, CanvasBase, \
 ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.

위는 idle 에서 kivyimport 하면서 발생한 에러 메시지이다.

(특별히 위 kivy 에러는 kivy 만을 pip 설치하면서 종속되는 패키지들을 깔지 않아 발생한 것이다. kivy 의 윈도우에서 설치하는 방법을 다시 잘 읽고 종속 패키지들을 깔면 해결된다.)

마지막의 "ImportError: DLL load faild: 지정된 모듈을 찾을 수 없습니다." 란 메시지는 두부분으로 나눠질 수 있다.

  1. 파이썬의 에러메시지 : ImportError
  2. 윈도우에서 exe 나 dll (나아가, 해당 exe, dll 이 의존하는(dependent한) dll 들 중 하나) 을 프로세스 메모리에 로드하려다가, 파일을 찾지 못하여 실패했다는 의미이다.

여기서는 파이썬의 특정 패키지(kivy)가 import 되기 위하여 어떤 dll이 종속되어 있는데, 그 중에 하나를 찾지 못하여 import 까지 실패했다는 의미가 된다.

이러한 DLL load failed / 지정된 모듈을 찾을 수 없습니다 에러에서 말한 찾을 수 없는 모듈을 찾는 가장 확실한 방법은 procmon (프로세스 모니터)를 사용하능 방법이다. 프로세스모니터는 dll의 로딩시도/성공/실패를 모두 로깅해 준다.

아래는 위 에러를 재현시키면서 procmon 으로 로그를 남긴 것 중에 일부 화면이다.

위 로그를 해석해 보면,

  • pythonw.exe 프로세스가 python site-packages\\kivy\\graphics 아래의 여러 파일들을 건드리고 있고,
  • instructions.pyd 까지는 SUCCESS 로 성공을 한다. (파일이 있는 것을 확인하거나, 읽거나 하는 작업들)
  • 그런데, 하늘색으로 반전된 부분부터 NAME NOT FOUND 가 나오며, 이것들은 모두 glew32.dll 을 디렉토리를 바꾸어 가며 찾는 것이다.
  • glew32.dll 이 아마도 instructions.pyd 또는 그 상위에 있는 어떤 dll의 종속성 때문에 필요하여 찾고 있으나, 현재 디렉토리, PATH 디렉토리들을 쭉 돌면서 파일을 찾아봐도 파일이 없는(NAME NOT FOUND) 것이다.
  • 이 해석이 맞는다는 것은, 에러 메시지의 스텍 트레이스 가장 마지막 줄의 from kivy.graphics.instructions import Callback, Canvas, CanvasBase 은 프로세스 모니터에서 마지막으로 성공한 kivy\\graphics\\instructions 와 부합한다는 것으로 확신할 수 있다.

(하늘색으로 반전된 부분은 procmon 로깅 중에 Result 가 NAME NOT FOUND 인 것들만 하일라이트 하도록 한 것임. 프로세스 모니터의 로그는 보통 지나치게 많으므로, 많은 경험이 있어야 문제부분을 짚어낼 수 있다.)

이런 식으로 윈도우에 깔린 파이썬의 "ImportError: DLL load faild: 지정된 모듈을 찾을 수 없습니다." 에러 원인을 찾아갈 수 있다.

문제의 원인을 찾아내는 것과 문제의 해결방법은 아주 다른 이야기이지만, 보통 해결하는 방법은.

  1. 찾지 못하는 dll 을 구글에서 검색해 본다. 이 dll이 최근 버전의 visual stduio 부터 새롭게 도입된 것이라면, 필요한 버전의 visutal c 재배포 패키지를 마이크로소프트 사이트에서 다운받아 (개발환경인 visual studio 와는 다른 것으로, 새롭게 도입된 기본 종속 dll들을 재배포 할 수 있도록 설치파일로 묶어놓은 것임에 주의.) 설치해 준다.
  2. 패키지가 잘못 만들어진 것일 수 있으므로, 패키지 개발자의 github 등의 issue 가 검색되는지 확인해 본다.
  3. 최신 패키지만 문제가 있는 것일 수 있으므로 하나 낮은 버전의 패키지 등으로 다시 설치해 본다.
  4. 깔끔하지 않은 방법이지만, 자신이 있다면, 패키지의 어딘가 다른 폴더에 들어 있는 문제의 dll 을 dll을 찾는 곳에 복사해 준다. system 폴더에 복사하는 방법도 있지만, 일반 사용자가 system 폴더에 출처가 확실하지 않은 dll을 복사하면 정상적인 것이 덮여쓰여질 수 있기 때문에, 그렇게는 하지 말자.

스택오버플로에도 위와 같은 방법을 설명한 답변이 있다. 한번 읽어보자. http://stackoverflow.com/a/38632674/100093

728x90