Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用setuptools创建调用外部C库的cython包_Python_Cython_Setuptools_Distutils_Setup.py - Fatal编程技术网

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/*.*