2011-12-16 65 views
0

我正在處理的java項目有一個.bat文件和一個.sh文件,它構建CLASSPATH以供項目運行。 (其他窗口爲.bat,其餘爲.sh)。從Python中獲取.bat文件中構建的CLASSPATH

現在,我正在編寫一個python腳本,它需要訪問由這些腳本創建的類路徑,如果在linux上爲.sh,而在Windows上爲.bat

目前,我這樣做對於Linux:

Popen(['bash', '-c', '. mkcp.sh && echo $CLASSPATH'], stdout=sp.PIPE).communicate()[0].strip() 

我想不出一個等效的方式做到這一點在Windows上。到目前爲止,我想出這個

check_output(['cmd', '/c', 'call mkcp.bat && echo %CLASSPATH%']) 

但是,把所有的命令在mkcp.bat文件到標準輸出。 (將@echo off添加到該文件對我來說不是一種選擇,即我無法修改它)。拋開這個問題,主要的問題是%CLASSPATH%被替換爲之前批處理文件運行,這不是我想要的。

我想到的另一種方法是,如果我創建一個Popen對象,並運行批處理文件,如果我可以訪問該進程的環境,我可以得到我想要的。但是從Popen的文檔來看,這看起來不可能。

有關如何實現此目的的任何想法?

回答

1

最簡單的方法是使用相關命令創建批處理文件。這樣,直到CMD處理相關行後,變量纔會擴展。還可以使用@echo off禁用回聲:

@echo off 
call mkcp.bat 
echo %CLASSPATH% 

然後只需調用在你的Python代碼的批處理文件。

如果你想這樣做,而沒有中間的批處理文件的嘗試:

check_output(['cmd', '/V:ON', '/c', '"@echo off && call mkcp.bat && echo !CLASSPATH!"']) 

/V:ON使環境變量的延遲擴展,當你使用!的替代,而不是%

+0

這太棒了。我會盡力讓你知道結果。兩者看起來都非常好。你有什麼特別的建議嗎? [我失去了我的互聯網,所以不能早點回來:)]。 – 2011-12-16 14:47:55