IDL/Programming

IDL Task 소개 (Part 3)

이상우_idl 2018. 5. 15. 11:00
728x90
반응형

(지난 회차에서 이어집니다)


지난 회차까지의 내용에서는 IDL Task를 제작하는 예제로서 my_calc_task라는 이름의 태스크를 직접 제작해보았습니다. 이를 위하여 확장자가 .pro인 소스코드 파일 및 확장자가 .task인 태스크 템플릿 파일을 만들어보았습니다. 두 파일은 당연히 확장자 앞부분의 이름은 같기 때문에 결국 두 파일의 이름은 다음과 같습니다.


my_calc_task.pro : IDL 소스코드 파일

my_calc_task.task : JSON 형식의 태스크 템플릿 파일


그리고 이 두 개의 파일로 정의된 my_calc_task라는 이름의 태스크를 IDL에서 실제로 사용하려면 다음과 같이 IDLTask 함수를 사용하면 됩니다.


IDL> task = IDLTask('my_calc_task')

IDL> task.a = 7.8

IDL> task.b = 9.4

IDL> task.execute

IDL> print, task.result

      17.2000


그래서 여기까지면 커스텀 IDL task를 정의하고 사용하는 기본적인 방법은 소개가 어느 정도 된 셈입니다. 그런데 이렇게 IDL에서 원활하게 사용하기 위해서는 두 파일이 IDL의 "현재 디렉토리" 안에 존재해야 합니다. 만약 그렇지 않다면 my_calc_task라는 태스크는 정의되지 못하고, 다음과 같이 에러만 발생하게 됩니다.


IDL> task = IDLTask('my_calc_task')

% No task matches: my_calc_task.

% Execution halted at: $MAIN$          


만약 "현재 디렉토리"가 어디냐에 상관없이 이 태스크를 언제든 이용할 수 있으려면 어떻게 해야 할까요? 사실 그 방법은 우리가 IDL에서 외부 라이브러리를 가져와서 설치해놓고 이 라이브러리에 속한 루틴을 언제든지 사용할 수 있도록 설정하는 방법과 거의 동일합니다.즉 IDL Astro나 Coyote와 같은 외부 라이브러리를 사용하려면, 이 파일들이 있는 디렉토리를 IDL의 경로(path)에 추가하는 경로 설정이란 작업을 해줘야 하는 것을 아마 많은 IDL 유저들께서 아실 것으로 생각합니다. 그 방법이랑 같습니다. 즉 태스크의 정의를 위하여 필요한 두 파일(.pro 및 .task)을 IDL의 경로에 속한 디렉토리 내에 넣어주면 됩니다. 또는 이 두 파일들이 존재하는 디렉토리를 IDL 경로에 추가하는 것도 방법이 되겠지요. 어차피 같은 얘기입니다. IDL에서 경로 설정을 하는 방법에 대해서는 관련 게시물이 있으므로 이 내용을 참조하시기 바랍니다. 따라서 커스텀으로 만들어진 IDL Task의 전천후 사용을 위해서는 IDL 경로에 속한 디렉토리에 관련 파일들을 넣어주는 방법을 사용하면 된다고 정리할 수 있습니다.


그런데 IDL Task를 사용하는데 있어서는 이러한 방법외에 약간 독특한 방식도 존재합니다. 바로 OS에서 자체적으로 지원되는 커맨드 라인 환경에서 사용하는 방식입니다. MS 윈도우즈 OS에서 CMD 환경 또는 리눅스나 Mac OS에서 터미널 환경이 이러한 경우에 해당됩니다. 즉, 태스크를 IDL 내에서 사용하는 것 뿐만 아니라 IDL 바깥에서 사용하는 것도 가능하다는 얘기입니다. 마치 ls, pwd, dir 등과 같은 명령처럼 사용할 수 있다는 의미가 됩니다. 실제로 IDL Task가 이렇게 외부 터미널 환경에서도 사용 가능하도록 해주는 원동력은 바로 IDL Task Engine입니다. 이 기능에 의하여 IDL Task는 외부 터미널 환경에서 표준입출력(Standard Input/Output) 기반으로 사용이 가능합니다. 또한 C, Java, Python 등과 같은 타 프로그래밍 언어에서도 실행이 가능하다고 합니다(이 부분은 아직 제가 직접 테스트해보진 못했습니다). 그래서 IDL Task를 외부 터미널 환경에서 사용하는 방법도 소개해보고자 합니다.


* 사실 IDL 프로그램을 외부 터미널 환경에서 실행하는 방법 자체는 이미 존재합니다. 터미널 프롬프트에서 idl -e 명령을 사용하는 방법인데, 관련된 내용은 제가 예전에 관련 게시물을 올린 적이 있으므로 그 내용을 참조하시면 됩니다. 다만 이 방법과 지금 소개하는 태스크 기반의 방법 사이에는 여러가지 차이점들이 존재합니다. 이러한 차이점들에 대해서는 이어지는 내용에서 적절히 소개하기로 하겠습니다.


IDL Task를 외부 터미널 환경에서 사용하는 방법은 그리 복잡하지 않습니다. 이 방법은 소위 표준 스트림(Standard Stream)이라고 부르는 일종의 표준화된 방식(stdin, stdout, stderr)을 따릅니다. 다만 IDL Task를 표준 스트림 방식에 의하여 터미널 기반으로 사용하기 위해서는, 입출력 인자들에 대한 정의를 JSON 형식으로 해야한다는 규칙이 존재합니다. 즉  IDL Task Engine에 의하여 이와 같은 표준 스트림 방식으로 태스크를 사용하기 위해서는 모든 입력 및 출력 인자들이 JSON 형식으로 정의되어야 합니다. 이 점은 염두에 두고 앞서 우리가 이미 만들어놓은 my_calc_task라는 태스크를 이런 방식으로 사용하는 방법을 구체적으로 살펴봅시다.


우리가 앞선 예제에서 my_calc_task라는 태스크를 사용할 때 인자 A는 7.8 그리고 인자 B는 9.4를 대입하여 계산 결과를 얻었는데, 똑같은 작업을 외부 터미널 환경에서 IDL Task Engine이라는 것을 사용하여 해보겠습니다. 이를 위해서는 입력 인자들을 JSON 형식으로포장하는 것이 먼저입니다. 그 내용은 다음과 같습니다.


{

  "taskName":"my_calc_task",

  "inputParameters":{"A":7.8, "B":9.4}

}


따라서 이 내용을 그대로 담은 params.json이라는 텍스트 파일을 하나 만드시면 됩니다. 이런 작업은 vi, vim, 메모장 등과 같은 별도의 텍스트 편집 프로그램을 이용하시면 됩니다. 그리고 터미널 환경에서 다음과 같은 명령문을 실행하면 됩니다. 다만 이 명령문의 세부 내용은 유저의 IDL 사용 환경에 따라 다릅니다. 아래 내용은 제가 사용중인 Mac OS의 터미널 환경에서 실행하는 경우에 해당됩니다. 여러분도 각자의 환경에 맞게 수정해서 해보시기 바랍니다.


Sangwoo$ /Applications/harris/envi55/idl87/bin/idltaskengine --compile < params.json

{"outputParameters":{"result":17.200000762939453}}


위의 예문에서는 실행 명령 및 그 결과가 함께 표시되어 있습니다. 명령문의 내용은 IDL이 설치된 폴더의 bin이라는 하위 폴더 내에 있는 idltaskengine이라는 명령을 사용하여 태스크를 실행하라는 것인데, 태스크의 이름 및 필요한 입력 인자들에 대해서는 우리가 이미 만들어놓은 params.json이라는 파일의 내용을 참조하게 됩니다. 그리고 그 결과는 보시는 것처럼 JSON 형식으로 전달됩니다. 명령문에 있는 < 기호가 바로 표준 스트림의 stdin의 역할을 합니다. 이와 같이 결과가 터미널에서 그대로 출력되게 할 수도 있지만, 결과를 담은 파일을 만들도록 할 수도 있습니다. 이를 위해서는 표준 스트림의 stdout 기능을 활용하면 되므로, 앞의 명령문에 다음과 같이 해당 내용을 추가하여 실행하면 됩니다. 물론 생성될 결과 파일 역시 JSON 형식이 되며 파일의 이름 자체는 직접 지어주시면 됩니다.


Sangwoo$ /Applications/harris/envi55/idl87/bin/idltaskengine --compile < params.json > output.json


이 명령을 실행하면 아까와는 달리 결과가 화면에 출력되지는 않습니다. 그 대신 파일로 간 것이므로, output.json 파일을 열어보면 다음과 같이 결과가 수록되어 있는 것을 볼 수 있습니다.


{"outputParameters":{"result":17.200000762939453}}


이와 같이 표준 스트림 방식을 이용하여 태스크의 실행이 가능하며, 입력 및 출력 자료들이 JSON 형식의 파일로 사용 및 생성되는 것도 확인할 수 있었습니다. 위의 예문들은 Mac OS일 경우를 기준으로 한 것인데, 만약 윈도우즈 OS의 경우라면 예를 들어 다음과 같은 명령문이 될 것입니다.


Sangwoo> "C:Program Files\harris\idl87\bin\bin.x86_64\idltaskengine.bat" --compile < params.json > output.json


하지만 이렇게 OS가 달라지더라도 표준 스트림이라는 방식 자체는 표준화된 규약이기 때문에 JSON 형식의 입력 및 출력 데이터를 다루게 된다는 것은 공통적으로 적용됩니다. 그렇기 때문에 여러 OS 및 여러 프로그래밍 언어들에서 이러한 표준화된 방식으로 IDL Task로 정의된 기능을 사용할 수 있도록 하는 것이 가능합니다. 예를 들어 IDL에서 task의 형태로 제작된 기능을 C나 Python 같은 언어에서 마치 외부 API(Application Programming Interface)를 불러다 쓰는 것처럼 사용하는 것도 얼마든지 가능하다는 얘기입니다. 물론 그 반대의 경우도 가능합니다. 어쨌든 이러한 모든 것들은 IDL Task 및 IDL Task Engine을 기반으로 하고 있다는 것을 알아두시면 좋을 것 같습니다.


* 아까 제가 IDL을 외부 터미널 환경에서 사용하는 기존의 방법을 잠시 언급했었는데, 이 방법의 경우는 표준 스트림 방식을 따르지는 않기 때문에 범용성 부분에서는 어느 정도 제약이 있는 것이 사실입니다.


오늘은 커스텀으로 제작된 IDL Task를 외부 터미널 환경에서 IDL Task Engine 기반으로 실행하는 방법에 관하여 살펴보았습니다. 이와관련된 좀 더 자세한 내용은 IDL 도움말에서 Environment -> IDL Tasks -> IDL TaskEngine 섹션에 잘 나와 있으므로 이 내용을 참조하시면 됩니다. IDL Task에 관해서는 아마 한 회 정도 더 할 얘기들이 있을 것 같습니다. 따라서 남은 얘기들은 거기서 또 이어나가기로 하겠습니다.

반응형