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