Использование 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
это простой текстовый файл.