从SAS运行Python脚本
我有一个SAS脚本,需要从中启动Python脚本。我需要SAS脚本从path环境变量中找到“python.exe”文件的第一个路径,而不是硬编码特定python安装的路径 这是我尝试使用的代码:从SAS运行Python脚本,python,cmd,sas,Python,Cmd,Sas,我有一个SAS脚本,需要从中启动Python脚本。我需要SAS脚本从path环境变量中找到“python.exe”文件的第一个路径,而不是硬编码特定python安装的路径 这是我尝试使用的代码: %let progdir = C:\Temp\scripts; %let pypath = C:\Temp\pypath.txt; x "if exist &pypath (del &pypath /Q)"; x "for %i in (python.exe) do @echo.%~$
%let progdir = C:\Temp\scripts;
%let pypath = C:\Temp\pypath.txt;
x "if exist &pypath (del &pypath /Q)";
x "for %i in (python.exe) do @echo.%~$PATH:i >> &pypath"; run;
data null; infile "&pypath" length=reclen obs=1;
input location $varying254. reclen;
call symput('runpython', trim(location));
run;
x "%bquote(&runpython) &progdir./gtfs_collapse_routes.py";
x "if exist &pypath (del &pypath /Q)"; run;
第二个x
调用似乎执行正确,因为&pypath
文件是用预期的内容创建的。但是,此代码会导致SAS警告,我希望消除此警告:
警告:宏I的明显调用未解析
这显然是对第二次x
调用中%i
的引用,但我不知道如何避免此警告。(我最初希望使用x“where python>>&pypath”
获取python路径,但由于未知原因,即使从cmd.exe运行该命令也无法创建文件。)
在@Joe以正确的方向进行了有益的提示之后,这是我更新的工作代码,用于在没有警告的情况下获取python路径:
%let command = %nrstr(for %i in (python.exe) do @echo.%~$PATH:i);
x "&command >> &pypath"; run;
当您希望能够解析宏变量时,可以使用SAS中的双引号。另一方面,单引号会阻止宏变量的解析,并且还会阻止SAS尝试解析看起来像宏变量的内容,如本例所示
x '... stuff ... ';
如果需要,您也可以使用宏引号(
%NRSTR()
等),不过我认为这里的常规单引号足以满足您的需要,除非您没有告诉我们什么。另请参阅规范。这为我指明了正确的方向。主要使用python开发,我总是忘记单引号/双引号不是到处都可以互换的。您有多少python安装?@Parfait目前大约有5或6个,来自各种软件包和Anaconda环境。