如何设置vsvars32环境变量?
我在设置Visual Studio 2008的scons环境变量时遇到了困难。
通常我会这样做:
%VS90COMNTOOLS%vsvars32.bat
or
call %VS90COMNTOOLS%vsvars32.bat
这样在我的命令行中是可以正常工作的。
我尝试在Python中使用subprocess来实现这个功能。
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)
我该怎么做才能实现这个呢?
3 个回答
0
这是一个简短的代码(Python 3),补充了之前的答案:
def vs_env_dict():
vsvar32 = '{vscomntools}vsvars32.bat'.format(vscomntools=os.environ['VS140COMNTOOLS'])
cmd = [vsvar32, '&&', 'set']
popen = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = popen.communicate()
if popen.wait() != 0:
raise ValueError(stderr.decode("mbcs"))
output = stdout.decode("mbcs").split("\r\n")
return dict((e[0].upper(), e[1]) for e in [p.rstrip().split("=", 1) for p in output] if len(e) == 2)
os.environ.update(vs_env_dict())
对我来说,这个方法有效!
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的命令行只会识别其中一种写法。
4
写一个批处理文件,这个文件会先运行 vsvars32.bat
,然后输出一些变量,格式是 VARNAME=value
。接着,让你的Python脚本来解析这些变量,并把它们注入到 os.environ
中。
这个过程是在Python自带的distutils模块中完成的,可以在这里查看源代码。