从SAS

时间:2017-05-12 19:41:49

标签: python cmd sas

我有一个SAS脚本,我需要从中创建一个Python脚本。我需要SAS脚本来找到#34; python.exe的第一个路径"来自PATH环境变量的文件,而不是硬编码到特定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.%~$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的引用,但我对如何避免此警告感到茫然。 (我原本想使用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;

1 个答案:

答案 0 :(得分:2)

当您希望能够解析宏变量时,使用SAS中的双引号。另一方面,单引号会阻止宏变量的解析 - 并且还会阻止SAS尝试解析看起来像宏变量的内容,就像在这种情况下一样。

x '... stuff ... ';

如果需要,您也可以使用宏引用(%NRSTR()等),但我认为常规单引号就足以满足您的需要,除非您没有告诉我们什么。