Использование setuptools для создания пакета Cython, вызывающего внешнюю библиотеку C

Я пытаюсь скомпилировать, установить и запустить пакет, который мы назовем myPackage, Он содержит *.pyx файл, который вызывает функцию fftw_set_timelimit() из библиотеки fftw, В настоящее время, когда я запускаю скрипт clientScript.py при импорте пакета я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "clientScript.py", line 5, in <module>
    import myPackage.myModule
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit

Из того, что я понимаю (я новичок в python и cython), связь с библиотекой C еще не выполнена в моем пакете. Действительно, мой setup.py файл выглядит так:

from setuptools   import setup,find_packages
from Cython.Build import cythonize
import os

setup(
    name = "myPackage",
    version = "0.0.1",
    url = "none",
    author = "me",
    author_email = "me@me.me",
    packages=find_packages(),
    ext_modules = cythonize("pyClo/pyClo.pyx"),
)

Как вы можете видеть мои setup.py использование файлов setuptools, Я решил сделать это, так как это рекомендуется в Руководстве пользователя по упаковке Python. Тем не менее, инструкции в документации по Cython используют distutils вместо. Связывание библиотек осуществляется через вызов distutils.Extension('file',['file.pyx'],libraries='fftw'), Как мне достичь того же результата, используя setuptools?

1 ответ

Решение

Оказывается setuptools имеет модуль setuptools.extension.Extension который используется так же, как distutils.extension.Extension модуль.

В конце концов, setup.py файл выглядит примерно так:

from setuptools import setup, find_packages
from setuptools.extension import Extension
from Cython.Build import cythonize

extensions = [
    Extension(
        "myPackage.myModule",
        ["myPackage/myModule.pyx"],
        include_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place
        libraries=['fftw3', 'fftw3f', 'fftw3l', 'fftw3_threads', 'fftw3f_threads', 'fftw3l_threads'],
        library_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place
    ),
]

setup(
    name = "myPackage",
    packages = find_packages(),
    ext_modules = cythonize(extensions)
)

Вот обзор моего установочного каталога:

.
├── MANIFEST.in
├── myPackage
│   └── myModule.pyx
├── README.rst
└── setup.py

где myModule.pyx это файл, который вызывает fftw_set_timelimit(),

MANIFEST.in содержит:

include myPackage/*.*

а также README.rst это простой текстовый файл.

Другие вопросы по тегам