IDL/Bridge & External Linking

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

이상우_IDL 2020. 9. 29. 16:21
728x90

윈도우즈 10용 IDL 8.8에서 IDL-Python Bridge를 셋업하는 방법에 관하여 제가 얼마전에 관련 게시물을 올린 바 있습니다.

 

blog.daum.net/swrush/560

 

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

IDL-Python Bridge 기능은 IDL 8.5 버전에서부터 도입되었으며, IDL에서 Python의 기능을 불러와서 쓰거나 반대로 Python에서 IDL의 기능을 불러와서 쓸 수 있도록 해주는 기능입니다. 아무래도 IDL 유저들 중

blog.daum.net

 

오늘은 Mac OS용 IDL 8.8에서 셋업하는 방법에 관하여 소개해볼까 합니다. IDL-Python Bridge에 대한 개요에 해당되는 내용은 이미 위의 게시물에서 다루었기 때문에 오늘은 셋업 과정으로 바로 들어가겠습니다. 사실 큰 틀에서 보면 Mac OS에서의 셋업 과정은 윈도우즈의 경우와 비슷합니다. 다만 Mac OS에서 셋업을 하려면 터미널 모드로 들어가서 환경변수 설정 및 기타 작업들을 해줘야 합니다. 지금부터 소개할 내용은 IDL 도움말에서 Contents -> IDL Bridges -> Python Bridge 섹션을 참조하였습니다.

 

먼저 당연히 IDL과 Python이 설치되어 있어야 합니다. 여기서는 Mac OS용 IDL 8.8이 설치된 경우를 가정합니다. 사실 Mac OS의 경우 최근 버전들에는 Python이 OS 내에 아예 탑재되어 나오는 추세입니다. 다만 제가 알아본 바로는 Mac OS 탑재되어오는 Python은 버전이 2.x인 것으로 알고 있습니다. 따라서 Python 3.x 버전을 사용하려면 별도로 설치를 해야 합니다. 더구나 최신 버전의 IDL에서는 브릿지 기능에서 Python 2.x 버전은 아예 지원이 되지 않기 때문에 어차피 3.x 버전을 설치하는 것이 좋을 것 같습니다. 물론 IDL의 버전과 호환 가능한 Python의 버전이어야 한다는 점은 변함이 없습니다. 이 문제와 관련해서는 위의 게시물의 내용을 참조하시기 바랍니다. 제가 오늘 소개할 내용을 테스트한 환경은 다음과 같습니다.

 

Mac OS Catalina 10.15.6

IDL 8.8

Anaconda Python 3.7.5

 

일단 설치된 Python이 잘 작동하는지 확인부터 해야합니다. 다음과 같이 확인해보면 됩니다.

 

>>> import sys

>>> sys.version

3.7.5 (default, Oct 25 2019, 10:52:18) \n[Clang 4.0.1 (tags/RELEASE_401/final)]'

>>> import numpy as np

>>> np.array([1.0,2,3]).dtype

dtype('float64')

 

확인이 다 되었다면 본격적인 셋업 과정으로서 가장 먼저 shell 스크립트에 Python의 경로 및 홈디렉토리에 관한 내용을 추가해야 합니다. Mac OS에서 터미널(terminal)을 실행하고 프롬프트상에서 이러한 작업을 해줘야 하는데요. 구체적인 방법은 터미널의 shell 환경이 어떤 종류인가에 따라 다릅니다. 따라서 현재 터미널의 환경이 어떤 종류의 shell 환경인가를 먼저 확인해야 합니다. 확인을 위해서는 터미널 프롬프트상에서 echo $SHELL 명령을 실행하면 됩니다. 제가 터미널 프롬프트 상에서 이 명령을 실행했더니 다음과 같이 출력됩니다.

 

prompt$ echo $SHELL

/bin/bash

 

즉 Bash shell이란 뜻입니다. 이 경우에는 .bashrc라는 파일의 내용을 수정하면 됩니다. Shell의 종류에는 Bash shell 말고 C shell도 있습니다.만약 C shell인 것으로 확인될 경우에는 .login이란 파일의 내용을 수정해야 합니다. 어떤 shell 상태인가는 사용자마다 다르기 때문에 유저 각자 먼저 확인을 해야 합니다. 그리고 shell 스크립트 파일의 내용을 수정하기 위해서는 터미널에서 vi 에디터를 사용하면 됩니다. 먼저 Bash shell인 경우에는 shell 스크립트 파일이 .bashrc이므로 다음과 같이 하면 됩니다.

 

prompt$ vi .bashrc

 

이렇게 하여 .bashrc 파일에 대한 편집 모드로 들어갑니다. 이 안에서 다음과 같은 내용을 추가합니다. 여기서는 Anaconda가 설치된 디렉토리가 /Users/<user-name>/anaconda3인 경우를 가정하였습니다. 물론 이 부분은 유저의 상황에 맞게 기입해야 합니다.

 

export PATH="/Users/<user-name>/anaconda3/bin:$PATH"

export PYTHONHOME="/Users/<user-name>/anaconda3"

 

이와 같은 두 줄의 내용을 추가한 후 vi 에디터를 나오면서 저장하면 됩니다. 만약에 Bash shell이 아닌 C shell 환경인 경우에는 shell 스크립트 파일이 .login 또는 .cshrc 파일이므로 이 파일을 vi 에디터로 편집하면서 다음과 같은 두 줄의 내용을 추가하면 됩니다. 물론 당연히 유저의 상황에 맞게 기입해야 합니다.

 

setenv PATH /Users/<user-name>/anaconda3/bin:${PATH}

setenv PYTHONHOME /Users/<user-name>/anaconda3

 

이와 같이 터미널의 shell 환경에 따라 작업 내용이 다르다는 점을 유의해야 합니다. 그리고 shell script의 내용에 위와 같이 두 줄의 내용을 추가하는 것 외에 다음과 같은 한 줄의 내용도 함께 추가해주는 것이 좋습니다.

 

source /Applications/harris/idl/bin/idl_setup.bash (Bash shell 환경인 경우)

source /Applications/harris/idl/bin/idl_setup (C shell 환경인 경우)

 

결국 shell 스크립트 파일 내에 총 세 줄이 더 추가된 셈입니다. 이제는 다음 단계이자 마지막 단계로 넘어가야 하는데요. 이를 위하여 다음과 같이 cd 명령을 사용하여 IDL 설치 디렉토리로 이동해야 합니다. 이 부분 역시 유저 각자 IDL 설치 디렉토리의 경로를 확인하여 상황에 맞게 기입해야 합니다.

 

prompt$ cd /usr/local/harris/idl88/lib/bridges

 

이제 이 상태에서 다음과 같이 python setup.py install 명령을 실행합니다.

 

prompt$ python setup.py install

 

이 명령을 실행하면 궁극적으로는 idl_python.pth라는 파일을 생성하게 됩니다. 사실 setup.py라는 파일은 Python 프로그램 파일입니다. 마치 IDL로 비유한다면 .pro 파일과 유사하다고 보면 됩니다. 이 setup.py라는 Python 프로그램을 프롬프트상에서 바로 실행하는 것입니다. 이 명령을 실행하면 아마 여러 줄에 걸쳐서 이런저런 문구들이 출력될 것입니다. 만약 모든 과정이 별다른 문제없이 진행되었다면 맨 마지막 줄은 다음과 같습니다.

 

Setup is complete.

 

만약 이렇게 끝났다면 진짜로 모든 셋업 과정이 무사히 다 끝난 것입니다. 그런데 경우에 따라서는 마지막 줄의 내용이 다음과 같은 경우가 발생할 수 있습니다.

 

Setup Failed. Exiting.

 

그러면 문구 내용 그대로 중간에 뭔가 문제가 생겨서 셋업이 제대로 진행되지 못한 경우입니다. 이런 경우에는 먼저 다음과 같이 sudo 명령을 함께 사용하여 실행해보는 것이 좋습니다.

 

prompt$ sudo python setup.py

 

여기서 사용된 sudo의 의미는 SU(Super User)의 권한으로 명령을 실행하라는 것입니다. 이렇게 해봐야 하는 이유는 앞서 셋업이 제대로 진행되지 못한 것이 특정 디렉토리들에 대한 접근 권한의 제한 때문일 수도 있기 때문입니다. 즉 python setup.py 명령을 시스템 관리자의 권한을 빌려 실행함으로써 접근 권한에 대한 제한 없이 명령이 실행되도록 하려는 것입니다. 이렇게 하여 Setup is complete 메시지를 보게 된다면 이제는 셋업이 모두 성공적으로 종료된 것입니다.

 

이제 모든 과정이 끝났고 테스트해볼 일만 남았습니다. 먼저 Python 내에서 IDL 기능을 외부 라이브러리의 형태로 불러오는 것부터 다음과 같이 테스트해봅시다. Python을 실행하고 그 안에서 다음과 같은 내용을 차례로 실행해보면 됩니다.

 

>>> from idlpy import IDL

>>> import numpy as np

>>> coords = np.random.random((10,2))

>>> x,y = coords[:,0], coords[:,1]

>>> r = IDL.sqrt(x**2+y**2)

>>> t = IDL.atan(y,x)

>>> print(r)

>>> print(t)

 

정상적으로 실행되었다면 아마 다음과 유사한 결과가 출력될 것입니다. 내부적으로 난수를 생성하여 활용하는 작업이기 때문에 출력된 값들은 매번 다릅니다.

 

>>> print(r)

[0.71244832 0.39832745 0.88932958 0.73896456 0.79653281 1.04581553

 1.15686733 0.6711274  0.57024589 0.511448  ]

>>> print(t)

[0.86351307 1.52622718 0.97498761 0.66759494 0.65993829 0.5448594

 0.58753683 1.35903394 0.54711748 0.95260029]

 

이번에는 반대로 IDL 내에서 Python 기능을 불러오는 것을 테스트해봅시다. 먼저 IDL을 실행한 다음 콘솔입력창에서 >>>를 입력하고 엔터를 누릅니다. 그러면 프롬프트가 >>>로 바뀌면서 마치 Python 환경과 같은 상태가 됩니다. 여기서 다음과 같은 내용을 입력하여 실행해봅시다.

 

IDL> >>>

>>> import numpy as np

>>> coords = np.random.random((10,2))

>>> x,y = coords[:,0], coords[:,1]

>>> r = np.sqrt(x**2+y**2)

>>> t = np.arctan2(y,x)

>>> print(r)

>>> print(t)

 

정상적으로 실행되었다면 아마 다음과 유사한 결과가 출력될 것입니다. 내부적으로 난수를 생성하여 활용하는 작업이기 때문에 출력된 값들은 매번 다릅니다.

 

>>> print(r)

[1.15609862 0.42084119 0.82503009 0.35095266 0.86940447 0.65239473

 0.52405477 0.81718421 0.71197078 0.90335185]

>>> print(t)

[0.81094222 0.75401004 1.18630554 0.1552526  1.17019571 0.12809942

 1.28490045 1.18330236 1.52018473 0.20102729]

 

그리고 >>> 프롬프트 상태에서 그냥 엔터키만 누르면 다시 IDL 프롬프트 상태로 되돌아온다는 것을 잘 기억해두시기 바랍니다. 그래픽 표출 기능도 테스트해볼 수 있는데요. 다음과 같이 IDL 내에서 Python의 그래픽 기능을 불러와서 간단한 플롯을 표출해봅시다.

 

IDL> >>>

>>> import matplotlib.pyplot as plt

>>> a = [3, 7, 6, 9, 4]

>>> p = plt.plot(a)

>>> plt.show()

 

이렇게 하면 다음과 같은 그림이 표출될 것입니다.

 

 

그리고 이번에는 다음과 같이 Python 내에서 IDL의 그래픽 기능을 불러와서 유사한 플롯을 표출해봅시다.

 

>>> from idlpy import IDL

>>> IDL.run("a = [3, 7, 6, 9, 4]")

>>> a = IDL.a

>>> p = IDL.plot(a, title='My Plot')

>>> p.color = 'magenta'

>>> p.thick = 2

 

이렇게 하면 다음과 같은 그림이 표출될 것입니다.

 

 

오늘은 Mac OS에서 IDL-Python 기능을 셋업하는 과정을 소개해보았습니다. 위에서 설명한 내용에 따라 셋업을 해서 사용해보시기 바랍니다. 그리고 위의 과정을 진행하는 도중에 예기치못한 또 다른 문제가 발생할 수도 있습니다. 아무래도 사용자의 환경이 모두 다르기 때문에 발생 가능한 이상증상들도 여러가지 종류가 있을 수 밖에 없는데요. 이와 관련해서는 따로 정리하여 차후에 소개해보기로 하겠습니다.

LIST