Python 使用setuptools创建调用外部C库的cython包
我正在尝试编译、安装和运行一个我们称之为Python 使用setuptools创建调用外部C库的cython包,python,cython,setuptools,distutils,setup.py,Python,Cython,Setuptools,Distutils,Setup.py,我正在尝试编译、安装和运行一个我们称之为myPackage的包。它包含一个*.pyx文件,该文件从库fftw调用函数fftw\u set\u timelimit()。当前,当我运行导入包的脚本clientScript.py时,我会收到以下错误消息: Traceback (most recent call last): File "clientScript.py", line 5, in <module> import myPackage.myModule ImportEr
myPackage
的包。它包含一个*.pyx
文件,该文件从库fftw
调用函数fftw\u set\u timelimit()
。当前,当我运行导入包的脚本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
正如您所看到的,我的
setup.py
文件使用setuptools
。我决定这样做,因为它是由政府推荐的。但是,中的说明使用的是distutils
。链接库是通过调用distutils.Extension('file',['file.pyx'],libraries='fftw')
完成的。如何使用setuptools
获得相同的结果?事实证明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\u set\u timelimit()
的文件
MANIFEST.in
中包含:
include myPackage/*.*
而
README.rst
仅仅是一个纯文本文件。根据,distutils.core.Extension
将第一个参数作为:“扩展名的全名,包括任何包,即不是文件名或路径名,而是Python点名”。因此,与其“myPackage/myModule”
,不如使用“myPackage.myModule”
@SylM我已经有一段时间没有使用python了……所以我需要做一些努力来再次检查是否用点替换斜杠“/”。正如您所建议的那样确实有效。但是,如果您测试解决方案并告诉我它可以,那么我将相应地编辑我的答案。通过“测试解决方案”“我的意思是从头开始一个新项目,并确保你能让它工作。你愿意这样做吗?;)@GLorieul我刚刚使用了上面使用虚线名称语法的模板,并成功编译。@Gilly谢谢!我相应地更新了我的答案:你能再次检查我所做的编辑是否正确吗?
include myPackage/*.*