Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SAS运行Python脚本_Python_Cmd_Sas - Fatal编程技术网

从SAS运行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.%~$

我有一个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.%~$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环境。