posted by cimple 2014. 12. 31. 03:02

옛날 'Maya2014에서 numpy 사용하기' 라는 글에서 약간 얼렁뚱땅 Maya2014 의 Python library 사용문제를 넘어갔었는데, 결국 언젠가는 굴러굴러 문제로 닥칠수밖에 없는 일. 하루를 모두 소진해서야 문제를 해결할 수 있었다.


욕을 하지 않으려고 해도 지랄맞은(...) 마야의 Python 시스템 때문에 정말 수도없는 테스트와 테스트 끝에 해결을 하고 나니 진이 다 빠지는 느낌이지만, 정리를 하지 않으면 누군가가 또 고생할 것이고 인간은 망각의 동물이니 나도 고생할 수 있기 때문에....


단지 Maya2014 에서 python nlopt 를 사용하는 문제뿐만 아니라, python library 를 사용하는데 있어 비슷한 문제가 발생했을 때에 해결하는 단초를 찾았다는 생각이다.





시간없는 사람들을 위해


먼저 일단 차치하고 Maya2014 에서 사용할수 있는 nlopt 라이브러리


nlopt_maya2014.7z


기존처럼 C:\Program Files\Autodesk\Maya2014\Python\Lib\site-packages 에 복사해 넣으면 된다.

(물론 Numpy 도 설치되어 있어야 돌아간다. Numpy 는 위 링크글 참조...)





1. 문제의 유형 및 발생원인


Maya2012 까지는 간편하게 Numpy 와 nlopt 를 설치할 수 있다. 비공식이긴 하지만 64bit python 컴파일된 binary 를 distribute 하기 때문이다. 이걸 설치하고 Maya 의 python 의 site-package 폴더에 복사만 해주면 된다.


numpy 링크

http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy


nlopt 링크

http://www.lfd.uci.edu/~gohlke/pythonlibs/#nlopt



그런데 이게 Maya2013 부터 numpy 부터 시작해서 라이브러리들이 import 가 잘 안되기 시작했는데, 그 이유가 Maya 의 Python 을 빌드한 컴파일러 문제이다. 이것을 알아보기 위해서 다음 명령어를 

import sys
print sys.version

각각 다른 버전의 Maya Script Editor 에 쳐서 확인해보면 다음과 같은 결과를 얻을 수 있다.


Maya2012


Maya2013


Maya2014


보다시피 Maya2013 부터 Python 컴파일러를 MSC v.1600, 즉 VS2010 compiler 로 컴파일했다는 사실을 알 수 있다. 


이게 아주 쓰레기같은게 뭐냐면 우리가 Python 홈페이지에서 받을 수 있는 파이선 2.x 버전들을 체크 해보면 MSC v.1500 로 컴파일되어 있다. 즉 VS2008 에서 컴파일한 버전을 배포하고 있다. v.1600 은 Python 3.x 버전 이후부터이다.


그런데 이 샹늠의 Maya 는 뭐가 잘났다고 혼자 독특하고 고고하게 VS2010 에서 컴파일한 파이선 2.x 버전을 사용하고 있다. 그것도 Maya2014 부터는 Python 2.7 버전을 사용한다. 아마도 추후에는 Python 3.x 버전으로 업그레이드를 할 목적이긴 하겠지만, 이것이 문제를 발생시키는 가장 큰 원인이었다.


이 문제 때문에 어렵사리 컴파일한 nlopt 를 사용할 수가 없었다. 가장 고생한 에러메시지는 바로 이것일 것이다.


ImportError: DLL load failed: %1은(는) 올바른 Win32 응용 프로그램이 아닙니다.


이걸 해결하기 위해서, 'Python2.7 자체를 VS2010 컴파일러로 다시 컴파일' 해야만 했다. 왜 그래야만 했는지는 아래에 설명...



2. python nlopt 컴파일하기


일단 내 입맛에 맞는 python nlopt 라이브러리의 binary 버전은 없다. 애초에 Window 에서 쓰라고 만든것도 아니고 Python nlopt 는 Wrap 해서 배포할 뿐이지 원래 c++ 라이브러리다. 직접 만들어 써야 한다고 보면 된다. 찾으려고 괜히 애쓰지 말고 컴파일 하는 것이 오히려 이득이다.


다음과 같은 순서를 따르면 된다.


1) 일단 nlopt 소스파일을 다운로드 받아서 압축을 풀어놓는다. 위치는 상관없다. 어차피 필요한건 컴파일한 다음 라이브러리 파일이다.

http://ab-initio.mit.edu/wiki/index.php/NLopt#Download_and_installation


2) 다음은 아래 페이지에서

http://ab-initio.mit.edu/wiki/index.php/NLopt_on_Windows


nlopt-2.4.2-dll64.zip (64-bit) 압축파일을 받아서 압축을 푼다. 미리 컴파일해둔 win64 용 .dll 파일이 있고 어쩌고 하는데 어차피 못쓴다. MinGW 로 컴파일한것이기 때문이다. 어차피 MSVC 로 다시 컴파일해야 한다. 이 압축파일의 용도는, nlopt 의 라이브러리파일 .lib 가 만들어지면, python 으로 컴파일할 수 있는 setup.py 파일이 포함되어 있기 때문이다.


3) 위 2) 의 링크 NLopt on Windows 페이지에서 CMake 관련파일 2개를 받는다. CMakeLists.txt 와 config.cmake.h.in 이다. 이것들을 1) 의 압축 풀어놓은 폴더에 넣는다.


cmake 로 VS 프로젝트를 생성-> 컴파일해서 Shared library (.dll) 생성 -> 이걸 Python 으로 컴파일 하는 것이 전체적인 얼개이다.


4) Cmake 로 해당 폴더를 Configure 하면 설정을 잘 잡아주는데, 주의해야 할 것은 

BUILD_SHARED_LIBS 옵션을 체크해 주어야 한다는 것이다. 여기서 컴파일된 .dll 파일을 가지고 python 에서 다시 컴파일한다.


5) Cmake 에서 Generate 하면 VS2010 프로젝트가 생성된다. 열어서 빌드하면 nlopt-0.dll 이라는 dll 이 생성될 것이다.


6) 이제 이것을 2) 에서 받았던 폴더에 넣는데, 원래 있던 dll 인 libnlopt-0.dll 을 지우고 그 이름으로 넣는다.


7) 이제 dll 을 가지고 lib 를 만들 차례이다. (사실 컴파일 자체는 해당 폴더의 README-WINDOWS 를 읽으면 있는 내용이다.) 명령 프롬프트를 써야 하는데, Visual Studio Win64 명령 프롬프트(x64) 를 실행시킨 다음 해당 폴더로 찾아들어간다. 그리고 아래 명령어 입력.


lib /def:libnlopt-0.def


8) 그럼 libnlopt-0.lib 파일이 만들어진다. 이제 python 으로 컴파일한다.


python setup.py build_ext --inplace


위 명령어로 컴파일하면 되는데, 여기가 지랄맞다!!!! 그 이유는, 여기서 python 으로 컴파일하는 것은 내가 환경변수에 등록된 python 으로 컴파일하는데, 이 python 이 처음에 말했지만 흔히 배포되는 Python2.x 의 MSC v.1500 컴파일된 python 을 사용하면 maya 에서 이 nlopt 를 쓸 수가 없다.


따라서 MSC v.1600 으로 컴파일된 python 으로 이 라이브러리를 빌드해야 한다. 그러기 위해서는 VS2010 에서 컴파일된 python2.x 버전을 사용해야 하는데, 나를 도와준 고마운 링크는 아래...


http://www.p-nand-q.com/python/building-python-27-with-vs2010.html


그냥 여기서 주는 python2.7 다운받아 썼다....지만 근데 site-package 를 뭔 이렇게 쓸데없이 깔아서 배포했는지 너무 무겁다; python 직접 컴파일하셔도 됨. 시간많으시면.


어쨌든 이 MSC v.1600 으로 컴파일된 python 으로 위 명령어를 통해 python 으로 컴파일하면, _nlopt.pyd 파일이 생성된다.


9) _nlopt.pyd, nlopt.py, nlopt-0.dll 3개의 파일을 maya 의 site-package 폴더에 넣으면 Maya 에서 잘 돌아가는 nlopt 를 감상할 수 있다.






써놓고 보니 간단해 보이는데 정말 python/라이브러리/심지어 Maya2014 까지 다시깔고, 컴파일 이런 저런 옵션 찾아가며 또해보고, document 읽고 또 읽고... 


해결은 했지만 이거 정말 Maya 문제 있다는 생각이다....





덧붙임1. NLopt 의 installation guide 에서 python_plugin 파트를 읽어보면


http://ab-initio.mit.edu/wiki/index.php/NLopt_Installation#Python_plugins


'Shared library 로 컴파일을 하면 자동으로 python plugin 을 설치해 줍니다!' (오오??) 라고 하는데 Windows 사용자들은 헛된기대 하지 말자... Linux make 파일에서 제공해주는 설정들이다. 실제로 make 파일과 configure 파일을 뜯어보면 python version 의 site-package 에 설치해주는 부분들이 있어서 한참 들여다봤지만 결국 Windows 에서 CMake 로 만든 VS Project 로 컴파일하는 유저들에게는 그런거 없는거로.....