运行 python setup.py install 时强制编译器

2024-02-24

有没有办法在运行时显式强制编译器构建 Cython 扩展python setup.py install? Where setup.py的形式为:

import os.path
import numpy as np
from setuptools import setup, find_packages, Extension
from Cython.Distutils import build_ext

setup(name='test',
  packages=find_packages(),
  cmdclass={'build_ext': build_ext},
  ext_modules = [ Extension("test.func", ["test/func.pyx"]) ],
  include_dirs=[np.get_include()]
 )

我正在尝试使用 Anaconda 3.16、Python 3.4、setuptools 18、NumPy 1.9 和 Cython 0.24 在 Windows 8.1 x64 上安装包。部署脚本改编自Cythonwiki https://github.com/cython/cython/wiki/CythonExtensionsOnWindows#using-windows-sdk-cc-compiler-works-for-all-python-versions and this https://stackoverflow.com/a/13751649/1791279堆栈溢出答案:

生成文件.bat

:: create and activate a virtual environement with conda
conda create --yes -n test_env cython setuptools=18 pywin32 libpython numpy=1.9 python=3
call activate test_env

:: activate the MS SDK compiler as explained in the Cython wiki
cd C:\Program Files\Microsoft SDKs\Windows\v7.1\
set MSSdk=1
set DISTUTILS_USE_SDK=1
@call .\Bin\SetEnv /x64 /release

cd C:\test
python setup.py install

问题是在这种情况下setup.py install仍然使用 conda 附带的 MinGW 编译器,而不是 MS Windows SDK 7.1。

  • So the DISTUTILS_USE_SDK=1 and MSSdk=1似乎对构建没有影响。我不确定从 conda virtualenv 中激活 MS SDK 是否会出现问题。

  • Running python setup.py build_ext --compiler=msvc使用 MS 编译器正确构建扩展,但随后运行setup.py install再次用 MinGW 重新编译它。同样适用于python setup.py build --compiler=msvc.

  • 也尝试过跑步%COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd"正如上面链接的答案中所讨论的,但对我来说,这会产生一个新的终端提示,颜色为黄色,并停止安装过程。

有没有办法强制编译器构建这个包,例如,通过编辑setup.py?


您可以在名为的单独文件中为 distutils 提供(默认)命令行参数setup.cfg(与你的平行放置setup.py)。请参阅docs https://docs.python.org/3.4/distutils/configfile.html了解更多信息。要设置编译器,请使用以下命令:

[build]
compiler=msvc

现在打电话python setup.py build相当于调用python setup.py build --compiler=msvc。 (您仍然可以通过调用来指示 distutils 使用其他编译器python setup.py build --compiler=someothercompiler)

现在你已经(成功地指示 distutils 使用amsvc编译器。不幸的是没有办法告诉它whichmsvc编译器使用。基本上有两种选择:

One:不执行任何操作,distutils 将尝试查找vcvarsall.bat并用它来设置环境。vcvarsall.bat(以及它设置环境的编译器)是 Visual Studio 的一部分,因此您必须安装它才能工作。

Two:安装 Windows SDK 并告诉 distutils 使用它。请注意这个名字DISUTILS_USE_SDK相当具有误导性(至少在我看来)。事实上它并没有告诉 distutils 使用 SDK(而且它是setenv.bat)来设置环境,而是意味着 distutils 应该假设环境已经设置好。这就是为什么你必须使用某种Makefile.bat正如你在OP中所示。

边注:VisualStudio 或 Windows SDK 的具体版本取决于目标 python 版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 python setup.py install 时强制编译器 的相关文章

随机推荐