Подтвердить что ты не робот

Принудительный компилятор при запуске 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?

4b9b3361

Ответ 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