在当前进程中通过python运行蝙蝠文件

Mic*_*elB 4 python build visual-studio-2012

我正在尝试通过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)
Run Code Online (Sandbox Code Playgroud)

如果运行此命令,bat文件将运行,并且在尝试执行该devenv命令时,我无法识别该文件。看起来文件运行在与脚本运行所在的子进程不同的子进程中。我确实需要在当前进程中运行它。我最终的目标是在python脚本内完成整个构建,并且会有很多调用来devenv进行构建的大部分。

谢谢。

der*_*n08 5

我和你有完全一样的问题。我试图将vcvarsall.bat作为python编写的构建脚本的一部分运行,并且我需要vcvarsall创建的环境。我找到了一种方法。首先创建一个名为setup_environment.bat的包装器脚本:

call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" amd64
set > environment.txt
Run Code Online (Sandbox Code Playgroud)

然后在您将调用vcvarsall.bat的python脚本中,运行包装器脚本,然后将文本文件中的环境变量读取到当前环境中:

    this_dir = os.path.dirname(os.path.realpath(__file__)) # path of the currently executing script
    os.system('call ' + this_dir + '\setup_environment.bat') # run the wrapper script, creates environment.txt
    f = open('environment.txt','r')
    lines = f.read().splitlines()
    f.close()
    os.remove('environment.txt')
    for line in lines:
        pair = line.split('=',1)
        os.environ[pair[0]] = pair[1]
Run Code Online (Sandbox Code Playgroud)


Tar*_*aro 5

这是一个简单的示例,应该可以开箱即用:

import os
import platform


def init_vsvars():
    vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
    vswhere_path = os.path.expandvars(vswhere_path)
    if not os.path.exists(vswhere_path):
        raise EnvironmentError("vswhere.exe not found at: %s", vswhere_path)

    vs_path = os.popen('"{}" -latest -property installationPath'.format(vswhere_path)).read().rstrip()
    vsvars_path = os.path.join(vs_path, "VC\\Auxiliary\\Build\\vcvars64.bat")

    output = os.popen('"{}" && set'.format(vsvars_path)).read()

    for line in output.splitlines():
        pair = line.split("=", 1)
        if(len(pair) >= 2):
            os.environ[pair[0]] = pair[1]

if "windows" in platform.system().lower():
    init_vsvars()
    os.system("where cl.exe")
Run Code Online (Sandbox Code Playgroud)

请注意,环境变量在 python 脚本退出后不起作用。


ste*_*eha 1

你试图做的事情不会成功。 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 脚本,但在批处理中这就是它的工作原理。但在进程终止后,您永远不会让变量继续存在。