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

rth*_*rth 23 python setuptools cython anaconda

有没有办法在运行时显式强制编译器构建Cython扩展python setup.py installsetup.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()]
 )
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Anaconda 3.16,Python 3.4,setuptools 18,Numpy 1.9和Cython 0.24在Windows 8.1 x64上安装软件包.部署脚本改编自用Cython 维基这个 堆栈溢出的答案.

Makefile.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
Run Code Online (Sandbox Code Playgroud)

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

  • 所以,似乎DISTUTILS_USE_SDK=1MSSdk=1没有对buid产生影响.我不确定是否从conda virtualenv中激活MS SDK可能是一个问题.

  • 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

Pet*_*erE 15

您可以在一个名为setup.cfg(与您平行放置setup.py)的单独文件中为distutils提供(默认)命令行参数.有关更多信息,请参阅文档.要设置编译器,请使用以下内容:

[build]
compiler=msvc
Run Code Online (Sandbox Code Playgroud)

现在调用python setup.py build等同于调用python setup.py build --compiler=msvc.(您仍然可以通过调用指示distutils使用其他编译器python setup.py build --compiler=someothercompiler)

现在你已经(成功地执导的distutils使用一个.MSVC编译器不幸的是没有选项告诉它.使用MSVC编译基本上有两种选择:

一:什么都不做,distutils将试图找到vcvarsall.bat并使用它来设置环境.vcvarsall.bat(以及为其设置环境的编译器)是Visual Studio的一部分,因此您必须安装它才能使其工作.

二:安装Windows SDK并告诉distutils使用它.请注意,该名称DISUTILS_USE_SDK相当具有误导性(至少在我看来).它实际上并不告诉distutils使用SDK(和它setenv.bat)来设置环境,而是意味着distutils应该假定已经设置了环境.这就是为什么你必须使用Makefile.bat你在OP中显示的某种方式.

附注: VisualStudio或Windows SDK的特定版本取决于目标python版本.