我有一个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;
答案 0 :(得分:2)
当您希望能够解析宏变量时,使用SAS中的双引号。另一方面,单引号会阻止宏变量的解析 - 并且还会阻止SAS尝试解析看起来像宏变量的内容,就像在这种情况下一样。
x '... stuff ... ';
如果需要,您也可以使用宏引用(%NRSTR()
等),但我认为常规单引号就足以满足您的需要,除非您没有告诉我们什么。