Принудительный компилятор при запуске 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 будет пытаться найти 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()
не забудьте отменить этот грязный трюк после компиляции.