2017-05-12 296 views
1

我有一個SAS腳本,我需要從中啓動一個Python腳本。我需要SAS腳本從PATH環境變量中找到「python.exe」文件的第一個路徑,而不是硬編碼到特定python安裝的路徑。從SAS運行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警告,我想消除:

警告:表面調用宏我沒有解決。

這顯然是在第二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; 
+0

你有多少個Python安裝? – Parfait

+0

@Parfait當前有5或6種,來自各種軟件包和Anaconda環境。 – nmpeterson

回答

1

在SAS雙引號。另一方面,單引號會阻止宏變量的解析 - 並且還會阻止SAS試圖解析看起來像宏變量的東西,就像這種情況一樣。

x '... stuff ... '; 

您還可以使用宏引用(%NRSTR()和這樣的)如果需要的話,但我覺得這裏經常單引號將能滿足你需要什麼,除非你不告訴我們的東西。

+0

另請參閱關於宏引用解析的規範[問題](http://stackoverflow.com/questions/27946244/why-wont-my-macro-variable-resolve)。 – Joe

+0

這指出我在正確的方向。我主要用python進行開發,我總是忘記單/雙引號在任何地方都是不可互換的。 – nmpeterson