setup.py для пакетів, які залежать як від cyton, так і від f2py

Я хотів би створити скрипт setup.py для пакета python з декількома підмодулями, які залежать як від cyton, так і від f2py. Я намагався використовувати setuptools та numpy.distutils, але поки що не вдалося:

Використання setuptools

I am able to compile my cython extensions (and create an installation for the rest of the package) Використання setuptools. I have, however, been unable to figure out how to use setuptools to generate the f2py extension. After extensive searching, I only found rather old messages like this one that state that f2py modules must be compiled Використання numpy.distutils.

Використання numpy.distutils

I am able to compile my f2py extensions (and create an installation for the rest of the package) Використання numpy.distutils. I have, however, been unable to figure out how to get numpy.distutils to compile my cython extensions as it always attempts to use pyrex to compile it (and I am using extensions specific to cython) recent. I have done a search to figure out how to get numpy.distutils for cython files and - at least as of a year ago - they recommend applying a monkey patch to numpy.distutils. It seems applying such a monkey patch also restricts the options that can be passed to Cython.

Моє запитання: який рекомендований спосіб написати скрипт setup.py для пакетів, які залежать як від f2py, так і від cyton? Чи застосовує патч до numpy.distutils дійсно спосіб піти ще?

19

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 ()

Друга установка() викликає, це numpy.distutils.core.Extension
і numpy.distutils.core.setup ()

4
додано
На жаль, посилання answerpot.com більше не працює. Дякую за вашу відповідь, хоча! :-)
додано Автор TheXMA, джерело

Виявляється, це вже не так. За допомогою 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/, і що < Модуль code> f2py є лише одним файлом Fortran. Налаштуйте, як потрібно.

2
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;