如何设置vsvars32环境变量?

2 投票
3 回答
4194 浏览
提问于 2025-04-16 05:19

我在设置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模块中完成的,可以在这里查看源代码

撰写回答