我正试图通过python脚本构建一个大型系统。我首先需要为visual studio设置环境。遇到问题,我决定看看是否可以建立并启动visual studio。我首先设置几个环境变量,然后调用C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat x64
完成后,我调用devenv /useenv。如果我在命令提示符下执行这些操作,一切正常,我可以在vs中执行我需要执行的操作。为此,我的python代码是:

import os
vcdir=os.environ['ProgramFiles(x86)']
arch = 'x64'
command  = 'CALL "' +vcdir+'\\Microsoft Visual Studio 11.0\\VC\\vcvarsall.bat" '+arch
os.system(command)
command = "CALL devenv /useenv"
os.system(command)

如果我运行这个命令,bat文件将运行,当它尝试devenv命令时,我得到它是不可识别的。bat文件运行在与脚本运行所在的子进程不同的子进程中。我真的需要在我当前的进程中运行这个。我的最终目标是在python脚本中完成整个构建,将有许多调用来完成构建的主要部分。
谢谢您。

最佳答案

你想做的事行不通。vcvarsall.bat设置环境变量,这些变量只在特定进程内工作。Python进程无法在同一进程空间内运行CMD.exe进程。
我有几种解决方案。
一种是运行vcvarsall.bat,然后找出它设置的所有环境变量,并让python为您设置它们。您可以使用命令set > file.txt保存cmd shell中的所有环境变量,然后编写python代码来解析此文件并设置环境变量。可能工作太多了。
另一种方法是生成一个运行vcvarsall.bat的批处理文件,然后从该批处理文件内部启动一个新的python解释器。新的Python解释器将处于一个新的进程中,但它将是一个在CMD.exe进程下的子进程,并且它将继承所有的环境变量。
或者,嗯。也许最好的方法是编写一个运行vcvarsall.bat的批处理文件,然后运行devenv命令。是的,这可能是最简单的,简单就是好的。
需要注意的是,在Windows批处理文件语言(和它之前的DOS批处理文件)中,当执行另一批文件时,由其他批处理文件设置的变量在相同的环境中设置。在*NIX中,您需要使用一个特殊命令source在同一个环境中运行shell脚本,但在批处理中它只是如何工作。但是,在进程终止后,您将永远不会获得变量。

10-05 23:25
查看更多