当前位置: 首页 > 面试题库 >

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

秦琦
2023-03-14
问题内容

我正在尝试编译,安装和运行一个我们称为的软件包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


问题答案:

事实证明,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是纯文本文件。



 类似资料:
  • 问题内容: 我有一个具有固定布局的应用程序,无法更改。我想使用setuptools将其包装起来,例如编写一个脚本。 使用官方文档,我能够编写第一个模板。但是,有问题的应用程序使用了很多其他数据文件,这些文件不是任何程序包的明确组成部分。这是一个示例源树: 这是麻烦所在:中的代码 读取文件和。对于前者,我可以通过添加一个空文件将其升级到程序包并由拾取来修补该问题。但是我怎么可能增加我的呢? 所提出的

  • 我使用IntelliJ创建了一个简单的应用程序,我将我的项目导出到一个jar文件,所有的事情都很好,jar文件工作正常。现在我决定在项目中使用jfoenix.jar作为按钮和文本字段,我向项目中添加了一个jfoenix,它在intellij环境中运行良好,但是当我将项目导出到jar时,它就不工作了(我单击创建的jar文件,什么也没有发生)。我知道我的问题与jfoenix.jar库有关,因为它似乎没

  • 如何用filesystem C++库创建文件? 我知道有不同的方法来创建一个文件,但我对文件系统库非常感兴趣。

  • 问题内容: 我已经完成了连接数据库(MySQL)的项目。现在,我要将项目导出为jar。但是我不知道如何包括其外部依赖项?在Eclipse中有什么方法可以做到这一点,还是应该为此使用任何脚本? 问题答案: 当你将项目导出为“可运行的jar”(在项目->导出->可运行的jar上单击鼠标右键)时,可以选择将所有依赖项打包到生成的jar中。它还有两种其他方式(请参见屏幕截图)来导出库,请在决定使用哪种打包

  • 某些安装进程需要调用包含于第三方开发的 DLL 中的函数。最佳的例子就是安装一个 Palm(TM) 通道。 一些关于 System.dll 的背景资料 System.dll 插件 (由 Brainsucker 开发) 使你可以通过提供 Call 函数来调用外部 DLL。有大量的由 System.dll 提供的函数,但是它们并不适合放在这里。若要得到更多关于其它函数的详细信息,请锁上门,取下电话,S

  • 我想创建一个自动应用其他插件(外部插件)的插件。这需要在调用“apply plugin”之前设置插件的buildscript依赖项。然而,我似乎无法在插件中添加buildscript依赖项,或者我得到:您无法更改未处于未解析状态的配置! 有解决办法吗? 我的示例(非工作)代码: