2010-10-11 223 views
2

我和我的設置SCons環境變量爲Visual Studio 2008
通常我掙扎如下:如何設置vsvars32環境變量?

%VS90COMNTOOLS%vsvars32.bat 

or 

call %VS90COMNTOOLS%vsvars32.bat 

而且這部作品在我的殼。

我嘗試使用子

subprocess.call([os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 

輸出做,在蟒蛇:以上

d:\N\workspace>scons test 
scons: Reading SConscript files ... 
Setting environment for using Microsoft Visual Studio 2008 x86 tools. 
KeyError: 'INCLUDE': 

調用批處理過程,但環境變量沒有從它繼承我的「主進程。

當我使用:

subprocess.call([os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 

我得到:

d:\N\workspace>scons test 
scons: Reading SConscript files ... 
WindowsError: [Error 2] The system cannot find the file specified: 
    File "D:\N\workspace\SConstruct", line 17: 
    subprocess.Popen(["call ", os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 
    File "C:\Python26\lib\subprocess.py", line 595: 
    errread, errwrite) 
    File "C:\Python26\lib\subprocess.py", line 821: 
    startupinfo) 

如何實現這一目標?

回答

4

編寫一個運行vsvars32.bat的批處理文件,然後輸出形式爲VARNAME=value的值,然後讓您的Python腳本解析這些值並將它們注入到os.environ中。

這是在python自己的distutils模塊see the source here中完成的。

+0

我沒有考慮這種方式,但似乎沒有辦法使用python子進程庫(沒有神祕的隱藏選項;)。 所以我會接受你的答案。 – bua 2010-10-15 09:43:20

+2

沒有辦法做到這一點的原因是因爲每個進程都有自己的環境,環境只能傳給子進程,而不能傳遞給父進程。因此,我們使用「帶外」通信方法將值應該*的值傳遞給父項。 – 2010-10-15 09:52:10

0

除了之前的答案。我的SConstruct摘錄:

for key in ['INCLUDE','LIB']: 
    if os.environ.has_key(key): 
     env.Prepend(ENV = {key.upper():os.environ[key]}) 

請注意Python中的變量名是區分大小寫的。確保您的env['ENV']字典不具有重複的變量名稱不同的情況下,否則Windows外殼將只會看到變量的一個變種。