使用setuptools创建一个调用外部C库的cython包

Gae*_*eul 19 python distutils setuptools cython setup.py

我正在尝试编译,安装和运行我们将调用的包myPackage.它包含一个从库*.pyx中调用函数的文件.目前,当我运行导入包的脚本时,我获得以下错误消息:fftw_set_timelimit()fftwclientScript.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
Run Code Online (Sandbox Code Playgroud)

根据我的理解(我是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"),
)
Run Code Online (Sandbox Code Playgroud)

如您所见,我的setup.py文件使用setuptools.我决定这样做,因为它是Python包装用户指南推荐的.但是,使用Cython文档中的说明distutils.链接库是通过调用来完成的distutils.Extension('file',['file.pyx'],libraries='fftw').如何使用相同的结果setuptools

Gae*_*eul 25

事实证明,它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)
)
Run Code Online (Sandbox Code Playgroud)

以下是我的安装目录的概述:

.
??? MANIFEST.in
??? myPackage
?   ??? myModule.pyx
??? README.rst
??? setup.py
Run Code Online (Sandbox Code Playgroud)

myModule.pyx调用的文件在哪里fftw_set_timelimit().

MANIFEST.in 包含:

include myPackage/*.*
Run Code Online (Sandbox Code Playgroud)

并且README.rst仅仅是纯文本文件.

  • 根据 [distutils 文档](https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension), `distutils.core.Extension` 作为第一个参数:“_全名扩展名,包括任何包 - 即不是文件名或路径名,而是 Python 点名称_”因此,应该使用“myPackage.myModule”而不是“myPackage/myModule”。 (2认同)