ERROR: 프로시저 'PYTHON'을(를) 찾을 수 없습니다.
PROC PYTHON 은 SAS Viya 계열의 기능이고 SAS 9.4 M8 에도 들어 있지 않다. 위 오류는 정상적인 반응이다.
9.4 에서 Python 을 쓰는 방법은 셋이다.
| 방법 | 주도권 | 비고 |
|---|---|---|
PROC FCMP 파이썬 객체 |
SAS 안에서 Python 함수 호출 | 9.4M6 이상. 서버에 Python 3 설치와 환경 변수 설정이 필요하다 |
| SASPy | Python 에서 SAS 제어 | Python 쪽이 중심일 때 |
X 명령으로 외부 스크립트 실행 |
OS 명령 수준 | 데이터 교환은 직접 처리해야 한다 |
autoexec.sas 나 세션 앞부분에 둔다. 관리가 가능하면 구성 파일에 넣어도 된다.
/* Windows */
options noxwait noxsync;
options set=PYTHONHOME "C:\Python311";
options set=PYTHONPATH "C:\Python311\Lib;C:\Python311\DLLs";
options set=PATH "%sysget(PATH);C:\Python311;C:\Python311\Scripts;C:\Python311\DLLs";
/* Linux */
options noxwait noxsync;
options set=PYTHONHOME "/opt/python-3.11";
options set=PYTHONPATH "/opt/python-3.11/lib/python3.11";
options set=LD_LIBRARY_PATH "%sysget(LD_LIBRARY_PATH):/opt/python-3.11/lib";
options set=PATH "%sysget(PATH):/opt/python-3.11/bin";
Windows 는 PATH 에 python.exe 와 DLL 경로가, 리눅스는 LD_LIBRARY_PATH 에 libpython3.x.so 경로가 반드시 들어가야 한다.
proc fcmp;
declare object py(python);
submit into py;
def add(a, b):
return a + b
endsubmit;
rc = py.publish();
s = py.call("add", 2, 3);
putlog "ADD RESULT=" s;
run;
quit;
FCMP 의 파이썬 객체는 데이터프레임을 직접 주고받는 인터페이스가 없다. CSV 나 Parquet 같은 중간 포맷을 WORK 디렉터리에 쓰고 읽는 방식이 안정적이다.
data work.have;
input id value;
datalines;
1 10
2 20
3 30
;
run;
%let workdir = %sysfunc(pathname(work));
%let in_csv = &workdir./have.csv;
%let out_csv = &workdir./want.csv;
proc export data=work.have outfile="&in_csv" dbms=csv replace;
run;
proc fcmp;
declare object py(python);
submit into py;
import pandas as pd
def transform(in_csv, out_csv):
df = pd.read_csv(in_csv)
df["value2x"] = df["value"] * 2
df["total"] = df["value"] + df["value2x"]
df.to_csv(out_csv, index=False)
return df.shape[0]
endsubmit;
rc = py.publish();
n = py.call("transform", "&in_csv", "&out_csv");
putlog "PY_ROWS=" n;
run;
quit;
proc import datafile="&out_csv" out=work.want dbms=csv replace;
getnames=yes;
run;
한글이 섞이면 인코딩을 맞춘다. pandas 는 기본이 UTF-8 이므로 encoding='utf-8-sig' 로 저장하고 PROC IMPORT 에서 encoding="utf8" 을 지정한다. 타입 보존이 중요하면 Parquet 을 쓴다.
Python 쪽에서 SAS 세션을 제어한다.
pip install saspy
import saspy
sas = saspy.SASsession(cfgname="<config-name>")
sas.submit("data test; x=1; run;")
연결 방식은 IOM, STDIO, HTTP 가 있고 sascfg_personal.py 에 정의한다. SAS 와 Python 이 같은 서버에 있거나 네트워크로 닿아야 한다.
%let workdir = %sysfunc(pathname(work));
x "python ""&workdir./transform.py"" ""&workdir./have.csv"" ""&workdir./want.csv""";
가장 단순하지만 데이터 교환을 직접 처리해야 하고, XCMD 가 허용된 환경에서만 동작한다.
SAS 9.4 설치 중 "SAS Configuration of Python 3.x" 항목이 나오는 것은 SAS 내부에서 쓰는 Python 환경을 구성하는 절차다. 기본값으로 진행하면 되고, SAS 가 자체 경로에 별도로 설치하므로 PC 에 이미 같은 버전의 Python 이 있어도 충돌하지 않는다. 설치 중 백신이나 보안 소프트웨어가 방해하지 않도록 하고 관리자 권한으로 실행한다.
이 구성은 SAS 내부 모듈용이며, PROC FCMP 파이썬 객체에서 쓸 Python 은 별도로 지정한다 (확인 필요).
| 오류 | 원인 |
|---|---|
| Python interpreter could not be initialized | PYTHONHOME · PYTHONPATH · LD_LIBRARY_PATH · PATH 경로 |
DLL 또는 .so 로딩 실패 |
32비트와 64비트 불일치, 라이브러리 경로 누락 |
| pandas 등 ImportError | 해당 Python 에 패키지 미설치 |
| 환경 변수 오버라이드 실패 | 보안 정책. 시스템 프로파일이나 SAS 기동 스크립트에서 설정 |