파이썬을 사용하면서 종종 패키지를 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 에서 kivy
를 import
하면서 발생한 에러 메시지이다.
(특별히 위 kivy 에러는 kivy 만을 pip 설치하면서 종속되는 패키지들을 깔지 않아 발생한 것이다. kivy 의 윈도우에서 설치하는 방법을 다시 잘 읽고 종속 패키지들을 깔면 해결된다.)
마지막의 "ImportError: DLL load faild: 지정된 모듈을 찾을 수 없습니다." 란 메시지는 두부분으로 나눠질 수 있다.
- 파이썬의 에러메시지 :
ImportError
- 윈도우에서 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: 지정된 모듈을 찾을 수 없습니다."
에러 원인을 찾아갈 수 있다.
문제의 원인을 찾아내는 것과 문제의 해결방법은 아주 다른 이야기이지만, 보통 해결하는 방법은.
- 찾지 못하는 dll 을 구글에서 검색해 본다. 이 dll이 최근 버전의 visual stduio 부터 새롭게 도입된 것이라면, 필요한 버전의 visutal c 재배포 패키지를 마이크로소프트 사이트에서 다운받아 (개발환경인 visual studio 와는 다른 것으로, 새롭게 도입된 기본 종속 dll들을 재배포 할 수 있도록 설치파일로 묶어놓은 것임에 주의.) 설치해 준다.
- 패키지가 잘못 만들어진 것일 수 있으므로, 패키지 개발자의 github 등의 issue 가 검색되는지 확인해 본다.
- 최신 패키지만 문제가 있는 것일 수 있으므로 하나 낮은 버전의 패키지 등으로 다시 설치해 본다.
- 깔끔하지 않은 방법이지만, 자신이 있다면, 패키지의 어딘가 다른 폴더에 들어 있는 문제의 dll 을 dll을 찾는 곳에 복사해 준다. system 폴더에 복사하는 방법도 있지만, 일반 사용자가 system 폴더에 출처가 확실하지 않은 dll을 복사하면 정상적인 것이 덮여쓰여질 수 있기 때문에, 그렇게는 하지 말자.
스택오버플로에도 위와 같은 방법을 설명한 답변이 있다. 한번 읽어보자. http://stackoverflow.com/a/38632674/100093
'프로그래밍 > Python' 카테고리의 다른 글
[Anaconda] 설치시 오류 : 'Destination Folder' cannot contain non-ascii characters (9) | 2017.09.15 |
---|---|
pow(a, n) for n is large (0) | 2017.06.14 |
nCr 캐시된 재귀함수로 구하기 (0) | 2017.01.12 |
[PYTHON|PIP] pip 설치 에러 unable to find vcvarsall.bat (0) | 2016.07.29 |
[PYTHON|KONLPY] Konlpy 설치시 문제점. (5) | 2016.07.28 |