2016년 3월 21일 월요일

파이썬의 라이브러리 NumPy + SciPy _____ 4

==========================================================
이 포스팅은 쓸모 없어진 포스팅입니다.
(NumPy + SciPy ____ 4 ~ NumPy + SciPy ____ 8)
해당 문제점은 Scipy 패키지를 빌드했던 툴(아마도 MS Visual Studio 201x)이 Windows XP를 지원하지 않아서 발생한 것으로 추측하고 있습니다.
이후의 포스팅에서 이 시행착오를 정리할 계획입니다. (아마도 NumPy + SciPy ____ 9)
==========================================================

배포판마저 실패하게 되자 뭔가 근본적인 문제가 있지 않나 생각하게 되었다.

이미 굉장히 많은 사람들이 사용하고 있는 패키지인데, 여러 소스를 통해 받아 보아도 동일하게 문제가 발생하고 있다면, 내가 아주 기본적인 무언가를 빼먹었거나 아니면 누구나 안되는 걸 가지고 골머리를 썪이고 있는게 아닐까?

보통은 혼자서 끄적여 보고, 시행착오도 거치고 난 후에 결론이 나오면 포스팅을 하곤 하는데, 이젠 귀차니즘 때문인지 두번 반복하는게 싫어졌고, 그래서 거의 직접 하면서 중간 중간 포스팅을 하고 있다.
그 때문인지 자꾸 옆으로 새거나 아무 쓸모 없는 내용들도 포함이 되고 있다.


배포판의 실패로 이번에는 scipy.org를 다시 살펴 보다가 등록된 문제점이 있는지 확인 해 보았다.



저기에서 ScyPy 항목으로 들어가서


너무 많길래 scipy.special로 검색해 보니, 비슷한 문제점이 등록되어 있다.

https://github.com/scipy/scipy/issues/5570

읽어보니 문제는 나와 동일한 상황.
이 사람도 크리스토프 골케의 버전을 받아서 사용했다고 한다.

여기에 누군가 댓글을 달았는데, MS의 런타임 라이브러리 문제같다면서 받아서 설치해보라고 한다.(아마도 MSVCRTxx.DLL 이런걸 말하는 듯)
그런데 문제점을 올린 사람이 이미 다 설치되어 있는 상황이라고 했으니 이 문제는 아닌 듯.

여기에 관리자가 이건 NumPy나 SciPy의 문제가 아니라 Third Party에서 배포한 버전에서 발생한 문제라면서 문제점을 Close 시켜 버렸다.


이게 직접적인 도움은 되지 않았지만, 암튼 같은 문제를 겪고 있는 사람이 있으며, 사용 환경에 따라 발생할 수 있는 문제라는 걸 알게 되었다.

먼저 _ufuncs.pyd에 대해 좀 더 살펴 보기로 했다.

이 파일을 에디터로 읽으면 바이너리 파일이라 알아 볼 수 없게 나온다.


하지만 맨 앞의 MZ는 MS의 실행파일에 붙는 일종의 표식이다.

이건 _ufuncs.pyd가 DLL일 수 있다는 의미.

그래서 몇가지 툴로 이 파일의 정체를 분석을 시도해 보다가 올리 디버거(OllyDbg)에서 불러들이는 과정에 이상한 메시지를 보게 되었다.


libifcoremd.dll을 찾을 수 없다?

저게 대체 뭔데?

다시 구글 검색.
https://www.google.co.kr/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=libifcoremd.dll



검색 결과 중 몇개를 찾아보니 Intel의 Fortran Comiler에서 사용하는 DLL이라는 정보.

처음엔 웬 Fortran? 이랬는데 생각해보니 과학 기술용 패키지를 빌드하는데 포트란을 사용했을지도 모르겠다는 생각이 들었다.


에라 모르겠다 하는 심정으로 Intel 사이트에서 Fortran용 실행 라이브러리를 받았다.
https://software.intel.com/en-us/articles/redistributable-libraries-of-the-intel-c-and-fortran-compiler-for-windows


이걸 설치하려다가.....정말 무슨 귀신이 씌운건지... 우연히 살펴보게 된 NumPy의 디렉토리.
NumPy/core 폴더에 이런 파일들이 있다.


중간즈음에 libxxxxx.dll들이 눈에 뜨인다.

이 폴더에 들어있는 모든 DLL 들을 확인해 보니 모두 Intel에서 만든 것이고, 이 DLL들을 모두 SciPy/special 폴더에 복사해 넣으면 O.K.

혹은 PATH에 있는 경로에 추가해도 될 거 같은데....개인적으로는 좀 찝찝하다.

=========================================================
이젠 지긋지긋해져서 그냥 마무리 하고 싶은데,

그래도 궁금한건 궁금한거니까...추가.

몇가지 더 확인을 해 보니, SciPy의 모듈 여러가지에서 에러가 발생하고 있다.

대부분은 동일한 문제로 _ufuncs를 로드하지 못해서 발생하는 것이다.

그렇다면 위에서 찾은 dll들을 따로 따로 복사할 수 없으니 한군데에 모아두고 사용하고 싶어진다.
그래서 MS-Windows에서 DLL을 탐색하는 범위를 찾아 보니 다음과 같았다.
  1. 현재 프로세스의 실행 모듈이 있는 디렉터리
  2. 현재 디렉터리
  3. Windows 시스템 디렉터리. GetSystemDirectory 함수가 이 디렉터리의 경로를 검색합니다.
  4. Windows 디렉터리. GetWindowsDirectory 함수가 이 디렉터리의 경로를 검색합니다.
  5. PATH 환경 변수에 나열된 디렉터리

그런데, python 디렉토리에 넣어두어도, 그 python 디렉토리를 PATH에 넣어두어도 문제가 발생한다.

심지어는 Windows\System32 디렉토리에 넣어도 안된다....ㅠ.ㅠ

대체 이건 무슨 조화인가?
=========================================================

댓글 없음: