2016년 3월 16일 수요일

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

파이썬에는 유용한 라이브러리들이 많은 것으로 알고 있는데,

얼마전에 우연히 호기심이 발동한 NumPy와 SciPy를 사용하는 방법을 정리해 두고 싶었다.


이유는.....

자칫 잘못하면 미궁에 빠져서 시간을 낭비할 수도 있겠다 싶어서....


우선 사용환경은,

OS : MS-WindowsXP sp3
Python : 2.7.1 (이 버전이 적합하다는 의미가 아니라, 처음에 이 버전으로 시작했다는 뜻. 나중에 업그레이드 하게 된다.)


먼저 NumPy와 SciPy를 찾아보자.
왜 두개의 라이브러리가 종종 자주 언급되는지는 금방 알게 된다.
같은 곳에서 만들어서 배포하고 있기 때문...

http://www.scipy.org/




이제 좌측 상단의 Install을 클릭해서 들어가면,



Windows와 Mac 사용자들은 과학 기술용 Python 패키지를 통째로 받아서 설치하는게 젤 쉽다고 가르쳐준다.
몇개의 배포판들이 있으니 각 배포판의 특징을 보고 자신에게 적당한 것을 고르면 된다.

하지만, 난 이미 Python이 설치되어 있으니 이 방법은 패스.

설치에 관한 설명이 있는 이 페이지의 하단을 가면 이런 부분이 나온다.

필요한 패키지들별로 각각의 링크가 되어 있으니, 사용자가 자신의 구미에 맞게 원하는 것을 설치하라는 것.

그리고 마지막의 문구가 눈에 똭~ 들어 온다.

Windows용 : 크리스토프 골케(?)라는 사람이 Python용 패키지들을 미리 빌드해서 설치할 수 있게 제공한다는 것.


흠....아마도 Python용 패키지들은 그냥 다운로드 받아서 적당한 위치에 복사하는 게 아니라 특별한 설치 과정이 필요한가 보다.

혹시라도 컴파일이 필요하다고 하면 뭘 싸야할지도 고민이니까 이걸 가져다 쓰자....라고 생각....


해당 사이트는 http://www.lfd.uci.edu/~gohlke/pythonlibs/

전혀 꾸밈이 없는 페이지.....이런 거 오래 못가던데....



패키지가 너무 많은 관계로 반드시 Ctrl-F를 이용해서 찾아야 한다.

그리고 모든 패키지의 나열을 한 페이지에서 하고 있기 때문에 브라우저의 부하가 심하다.

성능이 좀 떨어지는 컴퓨터에서는 부담을 느낄 수 밖에 없는 상황이다.



먼저 NumPy의 경우엔, MKL(Math Kernel Library)와 vanilla 빌드의 두가지가 있는데, 설명을 읽어 보니 MKL.
Python 2.x(cp27)에 Win32(win32) 환경이니 맨 위의 것을 다운로드 받는다.


SciPy의 경우에도 cp27과 win32인 맨 위의 것을 다운로드 받는다.
SciPy를 사용하려면 NumPy가 있어야 한다고 되어 있다.


그런데 다운로드 받은 패키지의 확장자가 whl임을 알 수 있는데,
이걸 설치하려면 pip이라는 것이 필요하다고 되어 있다.


그런데 pip은 Python 2.7.9 이상에 포함되어 있다고....ㅠ.ㅠ


별 수 없이 Python 업데이트 감행.

현재 최신 버전은 Python 2.7.11이고 기존 버전을 지우지 않고 설치하면 기존 버전에 Overwrite한다.


이제 [Python 설치 디렉토리]/Script/pip.exe가 있으므로 pip install [whl파일]을 실행하면 된다.....였는데...

pip의 버전이 낮아서 설치가 안 됨.

다행히 바로 pip을 업그레이드 하는 명령을 알려 준다.
(지금은 까먹었다. python -m pip install pip --upgrade 이게 맞는지 긴가민가 알쏭달쏭)


그렇게하고 나서 NumPy와 SciPy 설치

(pip가 이미 Python의 폴더를 알고 있으므로 별도로 설치할 폴더를 지정해주고 그럴 필요는 없다.)

그렇게 우여 곡절 끝에 다 설치가 되었다.


설치된 NumPy와 SciPy는 [Python 설치 디렉토리]/Lib/site-packages/에 존재하고 있으니 궁금하면 살펴 보길.


이제 scipy의 홈페이지에서 Getting Started 페이지를 가서 예제 프로그램을 저장하고 실행해 보자.
http://www.scipy.org/getting-started.html




헉...에러....

여기에서부터 본격적인 고난의 시작이다.

난 이 문제를 풀기 위해 고생을 좀 하고 있다.

먼저....파이썬의 저 난삽한 에러 메시지를 보는 법부터...

파이썬의 메시지는 처리한 순서대로 나온다. (most recent call last)

그러니까

1) example.py의 9번째 줄에 있는
   from scipy import special, optimize
  를 처리하기 위해서
2) [Python 설치 디렉토리]/Lib/site-packages/scipy/special/__init__.py를 읽어 와서 처리하던 중,
3) 627번째 줄에 있는
   from ._ufuncs import *
  를 처리하려고 했는데,
4) 여기에서 에러가 발생. 에러의 원인은
  Import Error : DLL load failed: 지정된 프로시져를 찾을 수 없습니다.


그러면 실제 저 모듈이 존재하는 걸까?


__init__.py도 존재하고 _ufuncs.pyd도 존재한다.


그러면 에러가 발생한 소스는?
__init__.py

에러메시지 그대로다.

아직은 python에 대해 완전히 초보와 마찬가지라 대체 무엇이 문제인지 감을 잡지도 못하겠다.

*.py가 아닌 *.pyd는 무슨 파일일까?
*.py가 아닌 *.pyd를 import 할 수 있는 걸까?
에러메시지의 DLL이라는 건 또 무슨 뜻일까?


====================================================
참고 삼아서, 아주 구닥다리 컴에서 Ubuntu Linux 10.04를 사용 중이다.
이제는 더 이상 지원을 해 주지도 않는 버전이라 패키지들의 업데이트 불가능한 상황.
확인해 보니 여기에 Python 2.6.5와 NumPy 1.3.0, SciPy 0.7.0이 설치되어 있었다.

간단한 예제 프로그램은 문제 없이 돌아가고 있는 상황.

그래서 위에서 문제가된 부분이 어떻게 되어 있는지 확인 해 보았다.


버전이 낮아서 그런지, 문제가 되었던 _ufuncs.pyd나 비슷한 이름의 파일은 보이지 않는다.

또한 __init__.py에서도 _ufuncs를 import하지도 않는다.
==========================================================


==========================================================
import error가 발생한 원인은, 크리스토프 골케의 바이너리가 MS-Windows XP를 지원하지 않기 때문인 것으로 보인다.

Windows XP및 WINE과는 호환성 없음
아직까지도 MS-WIndows XP를 사용하고 있었고, 그 이후의 버전은 사용해 본 경험이 없어서 몰랐는데, 마이크로소프트사가 Visual Studio의 어떤 버전부터 Windows XP와의 호환성을 선택사항으로 바꾼 것을 알게 되었다.

특별히 관심을 가지지 않은 오픈소스 혹은 프리웨어 개발자들은 이 사실을 모르고, 새로운 Visual Studio로 빌드한 바이너리를 배포했고, 이런 바이너리들은 Windows XP에서는 실행되지 않게 되었다.(빌드시에 옵션을 선택해주면 실행이 가능한 것으로 알고 있지만, 디폴트 옵션이 아니라고 들었다.)

어쨌든 이 포스팅이 8회까지 진행된 후에서야 이런 결론을 내리게 되어 매우 허탈하지만, 애초에 저 문구를 보지 못했던 내 자신을 탓할 수 밖에 없지 않겠는가.
- 2016년 11월 13일
==========================================================

댓글 2개:

Unknown :

혹시 이문제 해결되었나요~?

Re-coder :

워낙에 개인적으로만 작업하는 블로그라 이제야 댓글을 보았습니다.

2016년 11월 13일에 마지막에 추가한 내용이 맨 마지막 문단에...김성범님 댓글 바로 위에 있습니다.
Windows XP에서만 발생하는 문제로 추정되며,
크리스토프씨가 NumPy와 SciPy 라이브러리 빌드시에 Windows XP를 지원하도록 고려하지 않았을거라 생각합니다.
거기에 NumPy와 SciPy를 직접 빌드하는 작업이 꽤나 어렵더군요.ㅠㅠ
그래서 이런 결론으로 마무리한 포스팅입니다.

참고로 마지막 8번째 포스팅에는 어떤 분이 댓글을 달아 주셨는데, 제 덕분에 성공했다고 하시더군요.
혹시 김성범님께도 도움이 될지 모르니 마지막 포스팅과 댓글도 함께 보시기 바랍니다.