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