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

2024-10-01 13:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过python脚本构建一个大型系统。我首先需要为visualstudio设置环境。有了问题,我决定看看是否可以设置并启动visualstudio。我首先设置几个环境变量,然后调用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 file在与运行脚本的子进程不同的子进程中运行。我真的需要在我当前的流程中运行这个。我的最终目标是在python脚本中完成整个构建,并且将有许多调用devenv来完成构建的大部分。在

谢谢。在


Tags: 脚本osx86commandmicrosoftstudiovisualx64
3条回答

基于@derekswanson08的回答,我想出了一个更成熟的方法。使用wvwhere.exe与VS 2017一起推出。在

def init_vsvars():
    cprint("")
    cprint_header("Initializing vs vars")

    if "cygwin" in platform.system().lower():
        vswhere_path = "${ProgramFiles(x86)}/Microsoft Visual Studio/Installer/vswhere.exe"
    else:
        vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
    vswhere_path = path.expandvars(vswhere_path)
    if not path.exists(vswhere_path):
        raise EnvironmentError("vswhere.exe not found at: %s", vswhere_path)

    vs_path = common.run_process(".", vswhere_path,
                                 ["-latest", "-property", "installationPath"])
    vs_path = vs_path.rstrip()

    vsvars_path = os.path.join(vs_path, "VC/Auxiliary/Build/vcvars64.bat")

    env_bat_file_path = "setup_build_environment_temp.bat"
    env_txt_file_path = "build_environment_temp.txt"
    with open(env_bat_file_path, "w") as env_bat_file:
        env_bat_file.write('call "%s"\n' % vsvars_path)
        env_bat_file.write("set > %s\n" % env_txt_file_path)

    os.system(env_bat_file_path)
    with open(env_txt_file_path, "r") as env_txt_file:
        lines = env_txt_file.read().splitlines()

    os.remove(env_bat_file_path)
    os.remove(env_txt_file_path)
    for line in lines:
        pair = line.split("=", 1)
        os.environ[pair[0]] = pair[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脚本,但这正是它的工作方式。但在进程终止后,您将永远无法保持变量。在

我和你有同样的问题。我想逃跑vcvarsall.bat公司作为用python编写的构建脚本的一部分,我需要vcvarsall创建的环境。我找到了一个办法。首先创建一个名为setup的包装脚本_环境.bat公司名称:

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

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

^{pr2}$

相关问题 更多 >