IDL-Python Bridge 기능은 IDL 8.5 버전에서부터 도입되었으며, IDL에서 Python의 기능을 불러와서 쓰거나 반대로 Python에서 IDL의 기능을 불러와서 쓸 수 있도록 해주는 기능입니다. 아무래도 IDL 유저들 중에서도 Python을 사용해야 하는 경우도 요즘은 드물지않기 때문에, 양쪽 언어를 모두 사용해야 하는 유저들에게는 꽤 매력적으로 다가올 수 있는 기능이라고 봅니다. 그런데 IDL-Python Bridge 기능을 제대로 사용하기 위해서는 IDL과 Python 모두를 조건에 맞게 셋업해줘야 합니다. 이 과정이 사실 그렇게 단순하지는 않은데요. IDL 8.5 출시 당시에 제가 관련 게시물을 통하여 그 방법을 소개해드린 바가 있습니다.
http://blog.daum.net/swrush/326
Python Bridge 사용에 관하여
얼마전에 IDL 8.5의 출시 소식과 함께, Python Bridge 기능의 추가에 관한 간단한 언급을 했던 바 있습니다. 이 기능은 IDL에서 Python의 기능을 불러와서 쓰거나, Python에서 IDL의 기능을 불러와서 쓸 수 ��
blog.daum.net
물론 이 기능은 그 이후로도 계속 지원 및 업데이트가 되어왔고 가장 최신 버전인 IDL 8.8에서도 변함없이 지원되고 있습니다. 다만 위의 게시물을 올린 시기가 2015년으로 벌써 5년이나 되었고, 그 사이에 셋업 방법에 있어서 약간의 변동사항도 있었습니다. 그래서 전반적인 내용에 대한 업데이트를 하는 의미에서 2020년 9월 현재 IDL 8.8 버전에 맞는 내용으로 다시 한번 소개해보고자 합니다.
* 이 게시물의 내용은 MS 윈도우즈 10에서의 셋업 방법을 기준으로 작성되었습니다.
* 내용이 좀 길고 두서없는 감이 없잖아 있는데, 향후에도 필요시 내용을 보완할 예정입니다.
먼저 가장 기본적인 것은 당연히 IDL과 Python이 컴퓨터에 설치되어 있어야 한다는 것입니다. 그리고 IDL의 버전에 따라서 브릿지 기능이 지원되는 Python의 버전은 다릅니다. 현 시점(2020년 9월)을 기준으로 지금까지의 지원 히스토리를 보면 다음과 같습니다. (참조 : IDL 도움말에서 각 버전별 What's New)
IDL 8.8 버전에서는 Python 3.7 및 3.8 버전까지 지원 (2.7, 3.5 버전에 대한 지원 중단)
IDL 8.7.2, 8.7.3 버전에서는 Python 3.6.7 버전까지 지원
IDL 8.7.1 버전에서는 Python 3.6.6 버전까지 지원 (3.4 버전에 대한 지원 중단)
IDL 8.6.1, 8.7.0 버전에서는 Python 3.6 버전까지 지원
IDL 8.6.0 버전에서는 Python 3.5 버전까지 지원
IDL 8.5.0, 8.5.1 버전에서는 Python 3.4 버전까지 지원
그리고 Python 2.x 버전의 경우는 IDL 8.6 버전에서까지는 Python 2.7 버전이 지원되는 것으로 확인됩니다. 제가 이 게시물을 작성중인 2020년 8월 현재 Python의 가장 최신 버전은 3.8.3으로 되어 있습니다. 따라서 IDL-Python Bridge 기능을 제대로 사용하려면 현재 사용중인 IDL의 버전과 Python의 버전이 위의 내용과 맞아야 합니다. 예를 들어 IDL 8.7.1 버전을 사용중인데 Python 3.8 버전을 브릿지로 사용하지는 못합니다. 그리고 어떠한 버전의 Python을 사용하든간에 numpy 라이브러리의 설치는 필수입니다. 그리고 혹시 Python을 처음 설치해서 사용해야 하는 경우에는 아래 웹사이트에서 OS에 맞는 설치파일을 받아서 설치하면 됩니다.
Welcome to Python.org
The official home of the Python Programming Language
www.python.org
www.anaconda.com/products/individual
Anaconda | Individual Edition
Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.
www.anaconda.com
여기서 첫번째 링크는 잘 알려진 Python의 공식 웹사이트입니다. 그리고 두번째 링크는 Anaconda라고 하는 일종의 Python 패키지인데요. 저같은 경우는 이번에 이 Anaconda의 패키지를 설치하였습니다. 이 패키지의 장점은 Python 유저들 사이에서 많이 애용되는 추가 라이브러리들(NumPy, SciPy, IPython, Matplotlib 등)이 한꺼번에 포함되어 있다는 점입니다. 한번만 설치하면 이 라이브러리들도 다 포함이 되어 있습니다. 공식 웹사이트(python.org)에서 받을 수 있는 설치파일의 경우는 그냥 Python 자체의 설치를 위한 것이기 때문에, 추가 라이브러리들이 필요할 경우 개별적으로 받아서 설치를 해야 하는 약간의 번거로움이 있습니다. 따라서 그냥 Anaconda 패키지를 설치하는 것이 좀 더 편리합니다.
하여간 이러한 과정들은 각자 상황에 맞게 선택하면 되지만, 중요한 것은 NumPy 라이브러리는 반드시 설치되어 있어야 한다는 점입니다. 만약 Python은 설치되어 있으나 이 라이브러리가 아직 설치되어 있지 않다면 다음 웹사이트에서 받아서 추가 설치를 해야 합니다. OS별 설치 과정에 대해서는 이 웹사이트에 잘 설명되어 있습니다.
NumPy
Powerful N-dimensional arrays Fast and versatile, the NumPy vectorization, indexing, and broadcasting concepts are the de-facto standards of array computing today. Numerical computing tools NumPy offers comprehensive mathematical functions, random number g
numpy.org
사용중인 Python 내에 NumPy 라이브러리가 제대로 설치되어 있는지 확인하려면 Python 프롬프트상에서 다음과 같은 내용이 제대로 수행되는지 확인해보면 됩니다.
>>> import sys
>>> sys.version
'3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)]'
>>> import numpy as np
>>> np.array([1.0,2,3]).dtype
dtype('float64')
이러한 과정들이 다 완료되었다면, 그 다음은 디렉토리 경로(Path)에 대한 설정 작업이 필요합니다. 이러한 설정은 윈도우즈 OS 자체에서도 필요하고, Python 내에서도 필요합니다. 먼저 윈도우즈 OS에서는 PATH라는 시스템 변수의 내용을 약간 손을 봐야 하는데요. 이 설정을 위해서는 윈도우즈 10의 제어판에서 고급 시스템 설정으로 가야 합니다. 다음 그림과 같이 윈10의 제어판을 열어서 검색창에서 '고급 시스템 설정'을 타이핑해서 찾는 것이 가장 빠른 방법입니다.
이제 고급 시스템 설정 인터페이스에서 '고급' 탭의 하단에 있는 '환경변수' 버튼을 클릭합니다.
그리고 여기서 하단에 보이는 시스템 변수 내에서 'Path'라는 항목을 선택하고 '편집' 버튼을 클릭합니다.
여기서 '편집' 버튼을 누르면 다음과 같은 새로운 창이 뜨는데 여기서 '새로 만들기' 버튼을 누릅니다. 새로운 디렉토리 경로들 몇 개를 더 추가하기 위해서입니다.
'새로 만들기' 버튼을 누르면 추가할 디렉토리를 설정할 수 있습니다. 여기서 다음과 같은 4개의 항목들을 추가합시다.
C:\Program Files\Harris\IDL88\bin\bin.x86_64
C:\anaconda3
C:\anaconda3\Scripts
C:\anaconda3\Library\bin
4개 항목 각각의 내용은 사용자의 PC 내에서 IDL과 Python이 설치된 디렉토리 경우에 따라 위의 것들과는 약간 차이가 날 수도 있습니다. 각자의 상황에 맞게 수정하여 추가하면 됩니다. 새로운 항목들이 추가된 모습의 예는 다음과 같습니다 (제 PC에서의 모습입니다).
그리고 Python의 경우에는 pythonpath라는 자체 시스템 변수의 내용을 수정하여 다음과 같은 두 항목들이 추가되도록 하면 됩니다. 실제로 이 폴더안의 파일들을 보면 확장자가 .pyd 또는 .py인 파일들이 보입니다. 이와 같은 파일들이 Python에서 제대로 인식되도록 하기 위한 과정이라고 보면 됩니다.
C:\Program Files\Harris\IDL88\bin\bin.x86_64
C:\Program Files\Harris\IDL88\lib\bridges
물론 pythonpath에 이와 같은 항목들을 추가하는 방법은 사용환경에 따라 약간 다를 수 있습니다. 한가지 방법은 앞서 언급했던 Anaconda 패키지를 설치하면 제공되는 Spyder라는 개발환경 GUI를 실행해서 설정하는 것입니다. 이 Spyder는 마치 IDL의 개발환경인 IDLDE와 비슷한 느낌인데, 최근의 모습은 다음 그림과 같습니다. 요즘은 IDL도 그렇고 이렇게 Dark mode라고 하는 어두운 화면 모드를 제공하는 것이 일반적인 것 같습니다.
여기서 상단 메뉴에서 Tools - PYTHONPATH manager 버튼을 누르면 다음과 같은 모습의 팝업창이 뜨는데, 여기서 Add Path 버튼을 누르고 위의 두 폴더경로들을 추가합니다. 일단 여기까지는 Spyder 환경에서만 적용되는 설정이 됩니다.
그런데 Spyder 환경으로 한정짓지않고 그 외의 환경들(cmd 프롬프트나 python, ipython과 같은 텍스트 기반의 환경 등)에서도 위의 경로들이 적용되도록 하는 것도 필요합니다. 특히나 우리는 IDL-Python Bridge 기능을 셋업하는 중이기 때문입니다. 이러한 추가적인 설정을 위해서 PYTHONPATH manager 상에서 'Synchronize'라는 버튼을 누릅니다. 그러면 다음과 같은 메시지 팝업창이 뜹니다.
대략적인 의미는 Spyder 외의 다른 환경에서도 앞서 추가한 두 디렉토리 경로들이 반영되도록 할 것인데 기존의 PYTHONPATH 내에 존재했던 경로 정보들을 지울 것이냐 여부를 묻는 것입니다. 신규로 Python을 설치하여 이 셋업을 진행한 경우라면 'Yes' 버튼을 누르면 됩니다. 만약 기존에 이미 Python을 사용중이었고 그에 해당되는 경로들이 PYTHONPATH 내에 명시가 되어 있는데 이 내용을 지우지 않고 새 항목들만 추가해야 하는 경우에는 'No' 버튼을 누르면 됩니다. 이 과정을 마치면 Spyder 환경이 아닌 그냥 커맨드 입력 환경의 Python에서도 IDL 라이브러리(IDLPY)를 불러와 사용할 수 있습니다.
PYTHONPATH에 대한 설정을 위와 같이 Spyder 인터페이스 내에서 하는 방법 외에 다른 방법도 있습니다. 이렇게 하려면 앞서 언급했던 윈도우즈 10의 고급 시스템 정보 -> 환경변수 버튼을 눌러서 뜨는 팝업창 내에서 사용자 변수 내의 항목들 중에 PYTHONPATH 항목에 대하여 편집 버튼을 누르고 디렉토리들을 추가하면 됩니다.
이제 마지막 과정으로서 setup.py 파일을 실행해줘야 합니다. 이 작업은 cmd 프롬프트 상에서 해야 합니다. 다음과 같이 cmd 프롬프트에서 cd 명령을 사용하여 IDL 설치 디렉토리의 lib\bridges 디렉토리로 이동합니다.
cd C:\Program Files\Harris\IDL88\lib\bridges
그리고 여기서 다음과 같은 명령을 실행합니다.
python setup.py install
제가 제 PC에서 이러한 과정을 수행한 모습은 다음과 같습니다.
자 이제 이 과정까지 마쳤다면 셋업 과정은 다 마무리가 된 셈입니다(복잡하네요 ㅠㅠ). 이제 테스트를 위하여 Python을 실행하여 다음과 같은 명령이 문제없이 수행되는지 확인해보면 됩니다. 성공적으로 수행된다면 다음과 같이, 마치 IDL을 처음 띄웠을 때와 같은 IDL 관련 문구들이 뜨는 것이 보이게 됩니다. 다음 그림은 제가 cmd 프롬프트 상에서 Python을 실행하여 테스트한 모습입니다. 즉 Python 안에서 IDL 라이브러리를 불러온 것입니다.
이렇게 하면 Python 내에서 IDL 기능을 외부 라이브러리의 형태로 불러와서 사용할 수 있는 상태가 된 것입니다. 이제 바로 이어서 다음과 같은 명령들을 차례로 입력하여 실행해봅시다.
>>> 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.99046484 0.92209103 0.85008826 0.30807448 0.89508487 1.10360393
0.38073981 0.9592484 1.12018768 0.83780617]
>>> print(t)
[0.10773233 1.27773227 0.1898136 1.53522827 1.01358347 0.67782044
1.55274658 0.51306359 0.66029387 1.35076686]
이와 같이 Python에서 IDL의 기능을 불러와서 사용하는 것은 일단 성공했습니다. 이제는 반대로 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)
그러면 계산된 r, t 배열의 값들이 출력될 것입니다. 실제로 출력된 모습은 다음과 같습니다.
>>> print(r)
[0.32744122 0.94372175 0.91670257 0.73280031 0.89591651 1.12662502
0.58280914 0.67577543 1.31886279 1.11357611]
>>> print(t)
[0.79116329 1.13974025 1.02051027 0.88206582 0.99477251 0.50184576
1.28929542 1.01895484 0.7192969 0.47035722]
그리고 >>> 프롬프트 상태에서 아무 입력도 하지않고 바로 엔터키를 누르면 다시 IDL 프롬프트로 돌아오게 된다는 것도 잘 기억해두시기 바랍니다. 위의 예제는 IDL에서 Python의 커맨드 라인 입력 모드로 들어가서 작업을 한 경우입니다. 그런데 IDL에서 굳이 >>> 프롬프트로 들어가지 않고도 다음과 같은 방식으로 Python의 기능을 살짝 불러와서 작업하는 것도 가능합니다. 그냥 일반적인 IDL의 커맨드 입력 프롬프트 상에서 다음과 같은 내용을 한 줄씩 입력하여 실행해봅시다.
IDL> np = Python.Import('numpy')
IDL> coords = np.random.random([10,2])
IDL> x = coords[0,*]
IDL> y = coords[1,*]
IDL> r = np.sqrt(x^2+y^2)
IDL> t = np.arctan2(y,x)
IDL> print, r
IDL> print, t
이 내용을 잘 보면 전체적으로는 IDL 문법의 코드입니다. 하지만 맨 앞에서 Python의 numpy 라이브러리를 불러와서 그 기능을 일부 차용하여 작업이 진행된 것입니다. 실제로 출력된 결과는 다음과 같습니다. 아무래도 내부적으로 난수를 발생시켜서 계산에 사용했기 때문에 앞선 결과와는 값들이 아무래도 다를 것입니다.
IDL> print, r
1.0362406
0.21516469
0.98176476
1.1166377
0.94772642
1.3235834
0.73175223
1.1140810
0.89885925
1.1211703
IDL> print, t
0.84001681
1.3912343
0.15233310
0.57592916
1.1094878
0.74378966
0.16501382
0.60163009
0.49000487
1.0262922
어쨌든 이러한 방법은 >>> 프롬프트로 들어가지 않아도 되는 경우이기 때문에 통상적인 IDL 프로그램 내에 삽입하는 것도 가능합니다. 즉 IDL 프로그램을 작성하면서 그 안에서 Python 브릿지 기능이 부분적으로 사용되도록 하려면 위와 같은 방식으로 코딩 내용을 삽입하면 됩니다.
예제를 하나만 더 소개합니다. 이번에는 그림이 표출되는 예제로서 내부적으로는 Python의 matplotlib라는 라이브러리가 사용되는 경우입니다.
IDL> >>>
>>> import matplotlib.pyplot as plt
>>> import numpy.random as ran
>>> arr = ran.rand(100)
>>> p = plt.plot(arr)
>>> plt.show()
먼저 이와 같이 IDL에서 Python 프롬프트 모드로 들어가서 위의 내용을 실행하면 대략 다음과 유사한 모습의 그림이 표출될 것입니다.
이 경우는 IDL에서 Python의 기능을 불러와서 표출한 그림이기 때문에, 그 모습은 당연히 Python에서 그려진 그림과 같습니다. 그리고 이번에는 >>> 프롬프트로 들어가지 않고 다음과 같은 방식으로 실행해봅시다. 물론 결과로 나타나는 그림은 위와 유사할 것입니다. 물론 내부적으로 난수가 사용되기 때문에 실행할 때마다 그 모습은 다를 것입니다. 하지만 결과의 맥락은 동일하다고 볼 수 있습니다.
IDL> ran = Python.Import('numpy.random')
IDL> arr = ran.rand(100) ; call "rand" method
IDL> plt = Python.Import('matplotlib.pyplot')
IDL> p = plt.plot(arr) ; call "plot", pass an array
IDL> void = plt.show(block=0) ; pass keyword
그리고 이와 동일한 작업을 이번에는 Python 내에서 IDL 라이브러리를 불러와서 실행해봅시다. Python을 실행하고 그 안에서 다음과 같은 내용을 실행해봅시다.
>>> from idlpy import IDL
>>> import numpy.random as ran
>>> arr = ran.rand(100)
>>> p = IDL.plot(arr, title='My Plot')
>>> p.color = 'magenta'
>>> p.close()
그러면 팝업으로 그래픽창이 뜨고 다음과 같은 그림이 표출될 것입니다. Python에서 IDL의 기능을 불러와서 실행한 경우이기 때문에, 그림의 모습은 당연히 IDL에서 표출되는 그림의 모습과 같습니다.
이상의 내용은 IDL 8.8에서 IDL-Python Bridge 기능을 사용하기 위한 환경설정 및 실제 구동 예제를 윈도우즈 10에서의 예제를 통하여 살펴본 것입니다. 여기서 설명된 내용은 IDL 8.8 / Python 3.8인 경우인데, 다른 버전의 IDL과 Python인 경우에도 셋업 과정은 거의 같다고 보시면 됩니다. 일단 제가 테스트해본 케이스들은 정확히 다음과 같습니다.
IDL 8.8 / Python 3.8.3 (Windows 10)
IDL 8.8 / Python 3.7.4 (Windows 10)
물론 이외에도 여러가지 조합들이 존재할 수 있으므로 정상적인 작동 여부에 대해서는 유저 각자의 테스트가 필요할 것입니다. 그리고 Windows 10 외에도 Mac OS에서의 셋업 방법도 큰 맥락은 같습니다. 다만 셋업 과정의 세부사항들 중에는 OS 자체 특성상 다른 부분들도 좀 있습니다. 사실 Mac OS에서의 셋업 과정에 대해서도 소개해보고 싶은 생각은 있는데, 아무래도 테스트를 좀 더 해보고 준비가 되면 그 때 하는 것이 좋을 것 같습니다. 일단 Mac OS나 Linux 등의 OS에서의 셋업 방법에 대해서는 IDL 도움말에서 IDL Bridges - Python Bridge 섹션의 내용을 참조하실 것을 권합니다.
'IDL > Bridge & External Linking' 카테고리의 다른 글
IDL 버전별로 브릿지 기능으로 연동되는 Python 버전 일람 (1) | 2023.11.14 |
---|---|
Mac OS에서 IDL-Python Bridge 셋업 과정의 각종 문제 해결 방법 (0) | 2020.10.05 |
IDL-Python Bridge의 사용법 (Mac OS용 IDL 8.8 기준) (0) | 2020.09.29 |
IDL-Python Bridge에서 Qt plugin 문제 해결 방법 (0) | 2020.09.23 |
Python Bridge의 사용법 (Windows용 IDL 8.5 기준) (0) | 2015.08.31 |