Возможно вы уже сталкивались с ситуаций, когда у вас есть программа написанная на python (таких программ может быть множество и написаны они могут быть вашими коллегами) и вам надо встроить этот запуск в программный код SAS.

Как же это сделать?



Итак, для этого воспользуемся следующим open-source инструментом с github. Для начала скопируем SASJavaExec.java файл себе и скомпилируем его в jar файл. Важный момент: компилировать необходимо с помощью JDK 1.7_025, т.к. при использовании JDK 1.8 будет происходить ошибка в SAS коде.

1. Создаем классы: java -jar SASJavaExec.jar
2. Компилируем в jar файл: jar cfm SASJavaExec.jar manifest.txt SASJavaExec$1.class SASJavaExec.class

Где manifest.txt это файл из одной строки: Main-Class: SASJavaExec. Теперь у нас есть SASJavaExec.jar файл.

Далее нужно его прописать в настройках системы. Я запускал программу на Windows, поэтому в настройках среды нужно задать переменную CLASSPATH.

В моем случае это выглядело следующим образом:


Более подробно как можно это сделать можно посмотреть здесь.

После того как сделали все выше представленные шаги запускаем SAS.

Необходимо прописать следующие пути:

Путь к файлу python: %let PYTHON_EXEC_COMMAND = C:\Python27\python.exe;
Путь к вашей программе на python:

%let WORK_DIR = C:\SAS\T_Java\Example;	
python_pgm = "&WORK_DIR.\digitsdata_svm.py";

После этого пишем исполняем код — Data set:

/*** Part I: Python ***/
data _null_;
  length rtn_val 8;
  *** Python program takes working directory as first argument;
  python_pgm = "&WORK_DIR.\digitsdata_svm.py";
  python_arg1 = "&WORK_DIR";      
  python_call = cat('"', trim(python_pgm), '" "', trim(python_arg1), '"'); 
  put python_pgm = ;
  put python_arg1 =;
  put python_call=;

  declare javaobj j("SASJavaExec", "&PYTHON_EXEC_COMMAND", python_call); 
  j.callIntMethod("executeProcess", rtn_val);
run;

Далее запускаем нашу программу и смотрим лог выполнения:

python_pgm=C:\SAS\T_Java\Example\digitsdata_svm.py
python_arg1=C:\SAS\T_Java\Example
python_call="C:\SAS\T_Java\Example\digitsdata_svm.py" "C:\SAS\T_Java\Example"
27, 2016 6:36:39 AM SASJavaExec executeProcess
INFO: Executing [C:\Python27\python.exe, C:\SAS\T_Java\Example\digitsdata_svm.py, C:\SAS\T_Java\Example] ...
27, 2016 6:36:39 AM SASJavaExec executeProcess
INFO: Starting external process ...
 27, 2016 6:36:39 AM SASJavaExec executeProcess
INFO: External process exit value 0.

Все в порядке, программа digitsdata_svm.py выполнилась из SAS.

Надеюсь данная статья была для Вас полезной.

P.S. Пример самой программы SAS был также взят c github ссылку на который указал вначале статьи.
Поделиться с друзьями
-->

Комментарии (5)


  1. prefrontalCortex
    02.11.2016 16:25
    +7

    Что такое Python — знают все, а вот про SAS я, например, первый раз в жизни слышу. Вы бы хоть парой слов в первом абзаце рассказали бы, что это.


  1. Nikolay84
    02.11.2016 17:22
    -6

    prefrontalCortex, видимо Вы правы. Действительно здесь аудитория не слишком знакомы с этим программным продуктом.

    Кратко можно посмотреть здесь — https://ru.wikipedia.org/wiki/SAS_Institute.
    А так компания основана в 1976 году. На протяжение многих лет входит в Top 5 лучших работодателей (правда это про Америку).


    1. merlin-vrn
      03.11.2016 10:56
      +2

      Так, по-вашему получается, что мы запускаем Python через компанию в Америке? Или всё-таки, я предполагаю речь идёт про какой-то продукт этой компании, и вопрос «что такое SAS» — именно про этот продукт, а на компанию по большому счёту всем тут наплевать, как и на пятёрку лучших американских работодателей?

      Нужно было кратко написать в статье про продукт, а не кидать ссылку на его разработчика в википедии. На хабре у каждой статьи есть такая кнопочка — «отредактировать», вот её нажмите.


      1. alprk
        03.11.2016 12:57
        +1

        судя по всему это некая платформа для бизнес-аналитики. а еще «в штаб-квартире SAS действует детский сад на 600 мест»


  1. shamanis
    03.11.2016 11:42
    +3

    Непонятно что такое SAS, для чего он нужен, и зачем через него запускать код, написанный на питоне.