IDL/Bridge & External Linking

Mac OS에서 IDL-Python Bridge 셋업 과정의 각종 문제 해결 방법

이상우_IDL 2020. 10. 5. 15:12
728x90

제가 얼마전에 Mac OS에서 IDL-Python Bridge를 셋업하는 방법을 소개하는 게시물을 이미 올린 바 있습니다.

 

blog.daum.net/swrush/562

 

IDL-Python Bridge의 사용법 (Mac OS용 IDL 8.8 기준)

윈도우즈 10용 IDL 8.8에서 IDL-Python Bridge를 셋업하는 방법에 관하여 제가 얼마전에 관련 게시물을 올린 바 있습니다. blog.daum.net/swrush/560 IDL-Python Bridge의 사용법 (Win10용 IDL 8.8 기준) IDL-Pyth..

blog.daum.net

이 게시물에서 제가 이미 언급했듯이, 여기서 제가 기술한 셋업 과정은 IDL 도움말에 이미 소개되어 있는 관련 내용을 토대로 한 것입니다. 그런데 제가 실제로 셋업을 하는 과정에서 겪은 여러가지 숨겨진 난관들이 좀 있었습니다. 이런 문제들은 사실 IDL 도움말에서는 자세히 언급되어있지 않습니다. 또한 제 경험상으로는 이러한 문제들이 그 원인을 파악하고 해결책을 찾기가 그리 쉽지는 않았습니다. 그래서 제 경험담을 토대로 하여 이러한 부분들을 소개해보고자 합니다. 혹시라도 Mac OS에서 IDL-Python Bridge 기능을 셋업해서 사용해보고자 하는데 중간에 튀어나오는 골치아픈 문제들 때문에 좌절한 분들이 계시다면, 지금부터 소개할 내용을 한번 참조해보시길 권합니다. (물론 유저마다 머신의 환경이 똑같을 수는 없기 때문에 유저 각자가 겪게 되는 문제점들이 제가 소개하는 내용과 똑같다는 보장은 없으며, 여기서 언급된 내용들만으로 모든 문제점들이 100% 완벽하게 해결될 것이라는 보장을 해드릴 수는 없다는 점을 미리 말씀드립니다)

 

1. install_name_tool 관련 문제 [1]

 

셋업 과정의 마지막 단계에서 IDL 설치 디렉토리 내의 lib/bridges 디렉토리로 간 다음 python setup.py install 명령을 실행하게 됩니다. 그런데 이 명령을 실행했더니 뭔가 잘 진행되는듯 하다가 갑자기 다음과 같은 문구가 뜨면서 중단되는 경우가 있습니다.

 

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

 

*** install_name_tool failed.

 

즉 install_name_tool이라는 명령 자체가 아예 인식도 안되지 실행되 안되는 문제인데요. 이것은 사실 IDL의 문제가 아니고 주로 Mac OS Mojave 또는 Catalina에서 발생하는 Xcode 관련 문제입니다. 이런 경우에는 원래는 Xcode를 설치해주면 해결됩니다. 하지만 Xcode 자체가 워낙 용량이 크기 때문에 굳이 이게 다 필요하지 않다면 그냥 Xcode의 command_line_tool이라는 요소만 설치해줘도 됩니다. 이를 위해서는 터미널에서 다음과 같은 명령을 실행하면 됩니다.

 

prompt$ xcode-select --install

 

이 방법이 제대로 반영되었는지 확인하려면 터미널에서 git 명령을 실행해보면 됩니다. 만약에 git 명령을 실행했는데 아직도 xcrun: error 문구가 뜬다면, 다음과 같은 명령을 먼저 실행해야 합니다.

 

prompt$ sudo xcode-select --reset

 

여기서는 sudo가 사용되는데 이 sudo라는 명령 자체가 관리자 권한을 필요로 합니다. 그래서 실제로 위의 명령을 실행하면 관리자 패스워드 입력이 필요하다는 점을 유의해야 합니다. 어쨌든 패스워드까지 입력하여 이 명령을 실행한 다음에 xcode-select --install 명령을 다시 실행하면 됩니다. 그리고 나서 git 명령을 실행하여 별다른 이상이 없는는지 확인해보면 되는데, 아마도 이제는 git 명령을 실행했을 때 xcrun: error와 같은 에러 문구는 나오지 않을 것입니다. 그래서 이 모든 과정이 제대로 진행되었다면 문제가 해결된 것이므로 이제 python setup.py install 명령을 다시 실행하면 될 것입니다.

 

2. install_name_tool 관련 문제 [2]

 

바로 위에서 언급한 부분들을 해결한 후 python setup.py install 명령을 실행했는데 또 다른 문제가 발생하는 경우가 있습니다. 즉 이제는 install_name_tool 명령 자체는 인식이 잘되고 실행도 되지만, 이번에는 접근권한(permission) 관련 문제로 인하여 또 중단되는 현상입니다. 제가 실제로 이 과정에서 마주했던 문구는 다음과 같았습니다.

 

install_name_tool -change libpython3.7m.dylib /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so

error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: can't open input file: /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so for writing (Permission denied)

error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: can't lseek to offset: 0 in file: /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so for writing (Bad file descriptor)

error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: can't write new headers in file: /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so (Bad file descriptor)

error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: can't close written on input file: /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so (Bad file descriptor)

 

*** install_name_tool failed.

 

*** Check the paths above, or run the script as 'sudo python setup.py'.

 

이 문구의 내용은 결국 디렉토리 접근 권한 제한으로 인하여 install_name_tool 명령이 제대로 실행되지 못했다는 얘기입니다. 그래서 관리자 권한을 빌어서 이 명령을 다시 실행해보라고 언급하는 것입니다 (sudo python setup.py 명령으로). 그러면 그렇게 하면 됩니다. 즉 터미널에서 다음과 같이 sudo를 사용하여 다시 실행하면 됩니다. 이 경우에는 뒤에 install은 굳이 안붙여도 상관없는 것 같습니다.

 

prompt$ sudo python setup.py

 

3. sudo 및 PYTHONHOME 환경변수 문제

 

위와 같이 sudo를 이용하여 관리자 권한을 빌어서 python setup.py 명령을 실행했을 때 그 과정이 별 문제 없이 진행된다면, 그 진행과정을 보여주는 각종 문구들이 여러 줄에 걸쳐서 뜨다가 맨 마지막에 다음과 같은 문구가 뜨게 됩니다.

 

Setup is complete.

 

그러면 모든 과정은 제대로 다 끝난 것이므로 추가적인 작업 없이 이제 브릿지 기능을 맘놓고 사용하시면 됩니다. 그런데 불행히도 이 과정에서도 또 다른 문제가 발생하는 경우가 있습니다. 제가 이 과정에서 실제로 겪었던 현상은 다음과 같습니다.

 

*** PYTHONHOME environment variable must be set to your Python installation.

 

Setup failed. Exiting.

 

즉 PYTHONHOME이라는 환경변수에 대한 설정을 먼저 해야한다는 내용의 문구가 출력되면서 또 중단된 것입니다. 그런데 PYTHONHOME이라는 환경변수에 대해서는 shell 스크립트 파일(.login 또는 .bashrc 파일) 내에서 이미 설정을 한 상태입니다. 그 방법에 관해서는 앞선 게시물에서 이미 설명한 바 있습니다. 그런데도 왜 여기서 또 PYTHONHOME 환경변수를 설정하라고 할까요? 그 이유는 저도 사실 정확히 파악한 것은 아니지만 아마도 앞서 우리가 해놨던 PYTHONHOME 설정은 유저의 계정에서 유효한 것인 반면 sudo python setup.py라는 명령을 실행하는 관리자 권한의 설정에서는 PYTHONHOME 환경변수가 따로 정의되지 않은 상태였기 때문인 것으로 추측됩니다. 이런 경우에는 몇가지 해결책들이 있을 수 있겠지만, 다음과 같이 sudo를 사용하면서 PYTHONHOME 환경변수에 대한 설정을 아예 함께 해주는 것도 하나의 방법입니다.

 

prompt$ sudo PYTHONHOME='/Users/Sangwoo/anaconda3' python setup.py

 

물론 위의 명령에서 ' ' 안의 디렉토리 경로는 유저의 상황에 맞춰서 기입해야 합니다. 어쨌든 제가 이러한 명령으로 대체하여 실행했더니 별다른 문제없이 진행이 되었고 다행히도 결국 Setup is complete 문구를 만날 수 있었습니다. 제가 위 명령을 실행했을 때 실제로 진행된 내역은 다음과 같습니다.

 

Installing the IDL Python bridge.

Python-to-IDL library location: 

    /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so

IDL-to-Python library location: 

    /Applications/harris/idl88/bin/bin.darwin.x86_64/idl_python37.so

 

Setting Python library location within IDL libraries

 

Python library location: 

    /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib

 

install_name_tool -change libpython3.7m.dylib /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so

 

install_name_tool -change @rpath/libpython3.7m.dylib /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib /Applications/harris/idl88/bin/bin.darwin.x86_64/pythonidl37.so

 

install_name_tool -change libpython3.7m.dylib /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib /Applications/harris/idl88/bin/bin.darwin.x86_64/idl_python37.so

 

install_name_tool -change @rpath/libpython3.7m.dylib /Users/Sangwoo/anaconda3/lib/libpython3.7m.dylib /Applications/harris/idl88/bin/bin.darwin.x86_64/idl_python37.so

Creating idl_python.pth file containing the IDL Python bridge paths

running install

running build

running install_data

copying /tmp/idl_python.pth -> /Users/Sangwoo/anaconda3/lib/python3.7/site-packages

running install_egg_info

Writing /Users/Sangwoo/anaconda3/lib/python3.7/site-packages/idl_python-2.0-py3.7.egg-info

Removing temporary idl_python.pth file

 

Setup is complete.

 

4. INTEL MKL ERROR

 

위와 같은 문제점들이 해결되었다면 실제로 브릿지 기능을 사용할 수 있게 됩니다. 그런데 실제로 이 기능을 사용해보는 와중에 제가 겪은 문제가 또 있었습니다(ㅠㅠ). 이 문제는 IDL 내에서 Python 모드로 들어간 다음 그 안에서 외부 라이브러리를 import할 때 발생하였습니다. 즉 예를 들면 다음과 같습니다. 실제로 제가 겪은 사례입니다.

 

IDL> >>> 

>>> import numpy as np

% Loaded DLM: PYTHON37.

INTEL MKL ERROR: dlopen(/Users/Sangwoo/anaconda3/lib/libmkl_intel_thread.dylib, 9): Library not loaded: @rpath/libiomp5.dylib

  Referenced from: /Users/Sangwoo/anaconda3/lib/libmkl_intel_thread.dylib

  Reason: image not found.

Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib.

 

이와 같이 INTEL MKL ERROR라는 문구와 함께 에러가 발생하는 문제입니다. 이 현상은 matplotlib, sys 등 뭔가를 import할 때마다 발생하였습니다. 만약에 IDL 내에서 Python 모드로 들어간 상태가 아니라 그냥 Python을 바로 실행하여 그 안에서 각종 라이브러리들을 import할 때에는 아무 문제가 없습니다. 오직 IDL 내에서 Python 모드로 들어간 상태에서만 저런 현상이 발생하는 경우입니다. 그래서 저도 검색을 좀 해보고 해결책을 찾았는데, 이런 경우에는 다음과 같이 터미널에서 INTEL MKL 라이브러리를 따로 설치해주면 됩니다.

 

prompt$ conda install -c intel mkl

 

이 과정을 완료한 다음에 다시 한번 위와 같은 시도를 해보면 이제는 에러가 발생하지 않게 될 것입니다. 앞선 게시물에서 소개된 스크린샷도 이 문제를 해결한 후에 얻은 결과입니다.

 

 

지금까지 Mac OS에서 IDL-Python Bridge를 셋업하는 과정에서 마주칠 수 있는 문제점들을 4종류의 경우들로 나누어 소개해보았습니다. 앞서 이미 언급했지만, 이 내용은 제 경험을 토대로 하여 정리한 것이며 실제 상황은 유저마다 다를 수 있다는 점을 꼭 염두에 두고 참조하시기 바랍니다.

 

LIST