Принудительный компилятор при запуске python setup.py установить

есть ли способ явно заставить компилятор создавать расширения Cython при запуске python setup.py install? Где 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()]
 )

я пытаюсь установить пакет на Windows 8.1 x64 с помощью Anaconda 3.16, Python 3.4, setuptools 18, Numpy 1.9 и Cython 0.24. Сценарий развертывания адаптирован из Cython wiki и этой Переполнение Стека ответ.

make-файл.летучая мышь!--22-->

:: 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 FilesMicrosoft SDKsWindowsv7.1
set MSSdk=1
set DISTUTILS_USE_SDK=1
@call .BinSetEnv /x64 /release 

cd C:test
python setup.py install

проблема в том, что в данном случае setup.py install по-прежнему используется компилятор mingw, включенный в conda вместо MS Windows SDK 7.1.

  • так DISTUTILS_USE_SDK=1 и MSSdk=1 кажется, не оказывают влияния на buid. Я не уверен, что активация MS SDK из conda virtualenv может быть проблемой здесь.

  • под управлением 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 SDKsWindowsv7.1BinSetEnv.cmd" как обсуждалось в ответе, связанном выше, но для меня это создает новое приглашение терминала, окрашенное в желтый цвет, и останавливает процесс установки.

есть ли способ заставить компилятор для создания этого пакета, например, путем редактирования setup.py?

3 ответов


вы можете предоставить (по умолчанию) аргументы командной строки для distutils в отдельном файле с именем setup.cfg (размещены параллельно setup.py). Вижу docs для получения дополнительной информации. Чтобы установить компилятор, используйте что-то вроде:

[build]
compiler=msvc

называют python setup.py build - Это эквивалентно вызову python setup.py build --compiler=msvc. (Вы все еще можете направить distutils для использования другого complier, вызвав python setup.py build --compiler=someothercompiler)

вы (успешно руководил distutils использовать a индекса MSVC компилятор. К сожалению, нет возможности сказать это , который компилятор msvc для использования. В основном есть два варианта:

первый: ничего не делать и distutils будет пытаться найти vcvarsall.bat и используйте это для настройки среды. vcvarsall.bat (и компилятор, для которого он устанавливает среду) являются частью Visual Studio, поэтому вы должны установить его для работы.

второй: установите Windows SDK и скажите distutils использовать что. Имейте в виду, что имя DISUTILS_USE_SDK довольно missleading (по крайней мере на мой взгляд). На самом деле он не говорит distutils использовать SDK (и это setenv.bat) чтобы настроить среду, скорее это означает, что distutils должны предполагать, что среда уже настроена. Вот почему вы должны использовать какой-то Makefile.bat как вы показали в OP.

Примечание: конкретная версия VisualStudio или Windows SDK зависит от целевого python версия.


Как замечание: в linux вы можете использовать многие переменные среды autoconf. Для компилятора

CC=mpicc python setup.py build_ext -i

Ну, я нашел трюк в моем случае: я хотел использовать MSVC14.0 (из buildtools 2015), а не MSVC14.1 (buildtools 2017). Я отредактировал файл Lib\distutils_msvccompiler.py - ... Существует метод

_find_vcvarsall 

что звонит

best_version, best_dir = _find_vc2017()

Я заменил этот призыв

best_version, best_dir = _find_vc2015()

не забудьте отменить этот грязный трюк после компиляции.