setup.py для пакетов, которые зависят как от cython, так и от f2py

Я хотел бы создать сценарий 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?


person abergou    schedule 28.10.2011    source источник


Ответы (2)


Вы можете просто позвонить каждому отдельно в своем 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 ().

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

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

person Community    schedule 14.12.2011
comment
К сожалению, ссылка answerpot.com больше не работает. Спасибо за ответ! :-) - person AdrianO; 24.06.2015

Оказывается, это уже не так. И с 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. При необходимости отрегулируйте.

person tiago    schedule 27.01.2017
comment
У меня тоже такая же проблема. Однако после запуска sudo python3 setup.py install я получаю error : unknown file type '.f95' (from 'resource_dependency.f95'). Не могли бы вы направить меня? - person Peaceful; 22.11.2020