Принудительный компилятор при запуске python setup.py install
Есть ли способ принудительно заставить компилятор для создания расширений 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. Развертывание script адаптировано из Cython wiki и этого ответа на переполнение стека.
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
Проблема в том, что в этом случае 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 SDKs\Windows\v7.1\Bin\SetEnv.cmd"
, как обсуждалось в ответе, указанном выше, но для меня это вызывает новую подсказку терминала, окрашенную в желтый цвет и останавливает процесс установки.
Есть ли способ заставить компилятор для создания этого пакета, например, отредактировав setup.py
?
Ответы
Ответ 1
Вы можете предоставить (по умолчанию) аргументы командной строки для 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-компилятор использовать. В принципе есть два варианта:
One: Ничего не делайте, и distutils попытаются найти vcvarsall.bat
и использовать это для настройки среды. vcvarsall.bat
(и компилятор, для которого он устанавливает среду) для части Visual Studio, поэтому вам нужно установить, чтобы он работал.
Два: Установите SDK Windows и скажите distutils, чтобы использовать это. Имейте в виду, что имя DISUTILS_USE_SDK
довольно скуповато (по крайней мере, на мой взгляд). На самом деле он не говорит distutils использовать SDK (и его setenv.bat
) для настройки среды, а это означает, что distutils должен предположить, что среда уже настроена. Вот почему вы должны использовать какой-то Makefile.bat
, как вы показали в OP.
Боковое примечание: Конкретная версия VisualStudio или SDK для Windows зависит от целевой версии python.
Ответ 2
Как замечание: в linux вы можете использовать многие переменные среды autoconf. Для компилятора
CC=mpicc python setup.py build_ext -i