2010-10-11 179 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外壳将只会看到变量的一个变种。