【问题标题】:Microsoft Visual C++ Compiler for Python 2.7适用于 Python 2.7 的 Microsoft Visual C++ 编译器
【发布时间】:2014-11-26 05:23:07
【问题描述】:

我下载了Microsoft Visual C++ Compiler for Python 2.7,安装了,vcvarsall.bat的完整路径是:

C:\Users\UserName\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat

但是下面的代码不能返回它的路径:

from distutils import msvc9compiler
msvc9compiler.find_vcvarsall(9.0)

安装程序并没有将安装信息写入注册表,从find_vcvarsall()的源码来看,似乎在VS90COMNTOOLS设置中找不到vcvarsall.bat文件,因为它需要包含vcvarsall.bat 的文件夹名称为VC

productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")

如何在不修改注册表或文件夹名称的情况下使用编译器?

【问题讨论】:

    标签: python visual-c++


    【解决方案1】:

    将 setuptools 更新到 6.0 或更高版本。在这些版本中,setuptools 可以使用 vcvarsall.bat 自动检测 Microsoft Visual C++ Compiler for Python 2.7。

    请参考:

    1. https://pypi.python.org/pypi/setuptools/6.1#id4
    2. https://bitbucket.org/pypa/setuptools/issue/258

    【讨论】:

    • 这是给我的。我使用的是虚拟环境,它默认安装了旧版本的设置工具。
    • 很高兴能为您提供帮助。祝你有美好的一天。
    • 好吧,即使您安装了最新版本的 setuptools,只要您的 setup.py 使用 disutils.core.setup,它就不会检测到编译器。至少对我来说是这样。
    【解决方案2】:

    查看您尝试安装的软件包的setup.py 文件。如果它是一个较旧的包,它可能正在导入 distutils.core.setup() 而不是 setuptools.setup()

    我在 2015 年遇到了这个问题,结合了以下因素:

    1. 来自 http://aka.ms/vcpython27 的 Microsoft Visual C++ Compiler for Python 2.7

    2. 使用distutils.core.setup()的旧包

    3. 尝试使用python setup.py build 而不是使用pip

    如果您使用最新版本的 pip,它将强制 (monkeypatch) 软件包使用 setuptools,即使它的 setup.py 调用 distutils。但是,如果您不使用 pip,而只是在执行 python setup.py build,则构建过程将使用 distutils.core.setup(),它不知道编译器安装位置。


    解决方案

    第 1 步:打开相应的 Visual C++ 2008 命令提示符

    打开开始菜单或开始屏幕,搜索“Visual C++ 2008 32-bit Command Prompt”(如果您的 python 是 32 位)或“Visual C++ 2008 64-bit Command Prompt”(如果您的 python 是 64 -少量)。运行。命令提示符应在标题栏中显示 Visual C++ 2008 ...。

    第二步:设置环境变量

    在刚刚打开的命令提示符中设置这些环境变量。

    SET DISTUTILS_USE_SDK=1
    SET MSSdk=1
    

    参考http://bugs.python.org/issue23246

    第 3 步:构建和安装

    cd 到你要构建的包,然后运行python setup.py build,然后运行python setup.py install。如果要安装到 virtualenv,请在构建之前激活它。

    【讨论】:

    • 我有一个 python 包,它使用 numpy distutils 来编译 fortran 扩展,所以我不能使用 setuptools 因此它找不到 Visual Studio。这样就完美解决了问题。
    • 将导入更改为 setuptools 就像魔术一样,谢谢!我安装了不同的 c 编译器,但这个东西显然无法检测到它们。现在它可以...
    【解决方案3】:

    Christian Long 提供了一个切实可行的解决方案。但是如果不想每次都在“Visual C++ 2008 32-bit/64-bit Command”中修改,可以简单的找到“vcvarsall.bat”的位置,即“C:\Users\UserName\AppData” \Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat”,然后在 Python27\Lib\distutils\msvc9compiler.py 中修改 find_vcvarsall(version) 函数

    像这样:

    def find_vcvarsall(version):
        productdir= "C:/Users/UserName/AppData/Local/Programs/Common/Microsoft/Visual C++ for Python/9.0"
        vcvarsall = os.path.join(productdir, "vcvarsall.bat")
        if os.path.isfile(vcvarsall):
            return vcvarsall
        else:
            return None
    

    简单,丑陋但有用。

    请注意,Microsoft 不再允许您下载所需的 Visual Studio 2008 VC++ Build Tools,但可以在存档中找到该文件:https://web.archive.org/web/20210106040224/https://download.microsoft.com/download/7/9/6/796EF2E4-801B-4FC4-AB28-B59FBF6D907B/VCForPython27.msi

    【讨论】:

    • 非常有帮助。我尝试了无数其他的事情,这为我做到了。
    【解决方案4】:

    我在使用这个包时遇到了同样的问题,似乎他们并没有真正通过全新安装对其进行测试。

    最后我只是添加了一个 Key 来创建 COMPUTER\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VC,然后我添加了一个名为 productdir 的字符串值,该值设置为我到 vcvarsall.bat 的路径,这与你的相同。

    【讨论】:

      【解决方案5】:

      在命令行中升级您的 setuptools:

      pip install --upgrade setuptools
      

      6.0 以上最新版本的 setuptools 应自动检测 Microsoft Visual C++ Compiler for Python 2.7

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        相关资源
        最近更新 更多