setup.py для пакетов, которые зависят как от cython, так и от f2py - PullRequest
19 голосов
/ 28 октября 2011

Я хотел бы создать скрипт setup.py для пакета python с несколькими подмодулями, которые зависят как от cython, так и от f2py.Я пытался использовать setuptools и numpy.distutils, но до сих пор не получилось:

Использование setuptools

Я могу скомпилировать свои расширения Cython (и создать установку для остальной части пакета) используя setuptools.Однако я не смог понять, как использовать setuptools для создания расширения f2py.После тщательного поиска я нашел только старые сообщения, подобные этому , в которых говорится, что модули f2py должны быть скомпилированы с использованием numpy.distutils.

Использование numpy.distutils

Явозможность скомпилировать мои расширения f2py (и создать установку для остальной части пакета), используя numpy.distutils.Однако я не смог выяснить, как получить numpy.distutils для компиляции моих расширений Cython, так как он всегда пытается использовать Pyrex для его компиляции (и я использую расширения, специфичные для Cython) в последнее время.Я выполнил поиск, чтобы выяснить, как получить numpy.distutils для файлов Cython, и - по крайней мере год назад - они рекомендуют применить monkey patch к numpy.distutils.Кажется, что применение такого патча обезьяны также ограничивает параметры, которые могут быть переданы в Cython.

Мой вопрос: каков рекомендуемый способ написания сценария setup.py для пакетов, которые зависят как от f2py, так и от cython?Является ли применение патча для numpy.distutils действительно правильным способом?

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Вы можете просто позвонить каждому по отдельности в файле setup.py, как в
http://answerpot.com/showthread.php?601643-cython%20and%20f2py

# Cython extension
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  ext_modules = [Extension( 'cext', ['cext.pyx'] )],
  cmdclass = {'build_ext': build_ext},
  script_args = ['build_ext', '--inplace'],
)

# Fortran extension
from numpy.distutils.core import setup, Extension
setup(
  ext_modules = [Extension( 'fext', ['fext.f90'] )],
)

Ваш контекст вызова (я думаю, они называют это пространство имен, не уверен)
должен изменить то, что текущий объект Расширение и функция
Настройка () есть.

Первый вызов setup (), это distutils.extension.Extension
и distutils.core.setup ()

Второй вызов setup (), это numpy.distutils.core.Extension
и numpy.distutils.core.setup ()

2 голосов
/ 27 января 2017

Оказывается, это больше не так. Как с setuptools, так и с distutils (по крайней мере, версия numpy) можно иметь расширения с C, Cython и f2py. Единственное предостережение в том, что для компиляции модулей f2py всегда нужно использовать numpy.distutils для функций setup и Extension. Но setuptools все еще можно использовать для установки (например, разрешить установку версии для разработчика с python setup.py develop).

Чтобы использовать distutils исключительно, вы используете следующее:

from numpy.distutils.core import setup
from numpy.distutils.extension import Extension

Чтобы использовать setuptools, необходимо импортировать его до импорта distutils:

import setuptools

А остальная часть кода идентична:

from numpy import get_include
from Cython.Build import cythonize

NAME = 'my_package'
NUMPY_INC = get_include()
extensions = [
    Extension(name=NAME + ".my_cython_ext", 
              include_dirs=[NUMPY_INC, "my_c_dir"]
              sources=["my_cython_ext.pyx", "my_c_dir/my_ext_c_file.c"]),
    Extension(name=NAME + ".my_f2py_ext", 
              sources=["my_f2py_ext.f"]),
]
extensions = cythonize(extensions)
setup(..., ext_modules=extensions)

Очевидно, вам нужно поместить все остальные вещи в вызов setup(). Выше я предполагаю, что вы будете использовать numpy с Cython вместе с внешним C-файлом (my_ext_c_file.c), который будет иметь значение my_c_dir/, а модуль f2py - это всего лишь один файл Fortran. Отрегулируйте по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...