【问题标题】:Can you cimport an .so file?你可以导入一个.so文件吗?
【发布时间】:2019-06-26 15:48:22
【问题描述】:

我有一个来自外部库的名为 tissue-classifier.cpython-37m-x86_64-linux-gnu.so 的 .so 文件,我想导入它,以便可以在我的本地类之一中扩展它。由于我正在扩展一个类,我需要使用cimport 将其作为扩展类型导入,我想知道这是否可能。如果我使用普通的 import 语句,那么我将得到一个 Python 编译版本,它不能用于扩展我当前文件中的 cdef 类。

当我尝试cimport tissue_classifier 文件时,它给了我一个错误,即找不到 tissue_classifier.pxd 文件,这是有道理的,因为它是 .so 格式。对不起,如果这是一个愚蠢的问题,我只是暂时无法弄清楚。

【问题讨论】:

  • 您可以导入一个 .so 文件(如果它适合 Python)。但是 cimport 是不同的:它发生在模块由 Cython 编译时,而不是在运行并需要 .pxd 文件时发生。您已被告知(至少两次)问题很可能出在 Python 路径上。我建议您编辑此问题以显示相关文件的存储位置以及您对 setup.py 中的路径进行的尝试。 This bit of documentation 可能有用。
  • 抱歉没有说明清楚。当我发现我要导入的包不是.pxd 格式,而是.so 格式时,我已经解决了路径问题。我不再收到那个错误了。如果不直接从 Github 获取它,我无法导入 .pxd 文件,我不知道该怎么做。相反,我想知道是否可以从这个.so 文件中导入扩展类型来扩展 cdef 类。
  • 没有。如果没有 .pxd 文件,您将无法使用 cimport。您可以正常继承该类,但不能使用cdef classIn your earlier question 你说“dipy/tracking/local 包含两个组织分类器.pyx 和组织分类器.pxd” - 有什么变化?
  • 在指定目录的Github repository中,有.pxd.pyx文件。然而,当我决定检查我安装的实际目录时,它显示了this,其中的文件都是.so 格式。有没有办法直接从 Github 导入它们?
  • 现在更有意义了!如果您只需要一个文件,最简单的方法可能就是从 github 复制它(使用“原始”按钮获取原始文件,然后使用 .so 文件保存到目录中);如果这不起作用,那么您可能需要尝试非 anaconda 的安装方式(pip 或源代码)

标签: python import compilation cython .so


【解决方案1】:

不,*.so 文件无法导入。

如果一个人有 C/CPP 背景,那么使用以下模型可能最容易理解 pyx/pxd/so-business:

  • 生成的扩展名 (*.so-file) 对应于 C/CPP-world 中的最终工件,它可以是可执行文件、共享对象 (*.so) 或库/对象文件集合。如果您只是运行生成的程序,这就是您所需要的。例如,您可以使用(并且可能会使用)CPython 解释器,而无需构建它或拥有其源代码。类似地,如果你有一个二进制扩展 (*.so),你可以导入并使用它,而不必构建它(或者甚至在你的机器上拥有相应的 pyx 文件或编译器)——这就是 @987654321 提供的@。
  • *.pyx 对应于具有功能定义的 c/cpp 文件。如果您想从源代码构建生成的工件,则需要这些文件。在 C/CPP 世界中,这个构建过程将通过使用 make 或类似的来触发。如果您通过 python setup.py install 安装软件包,则需要 pyx 文件 - 这对应于调用 make
  • *.pxd 对应于 headers (h/hpp-files):它描述了生成的 so-files 中的功能,因此可以重用。例如,仅拥有 CPython 解释器不足以构建扩展 - 必须安装开发版本,因此还包括 Python.h&Co。出现在机器上。

那么有什么办法呢?


第一种可能性:

如果包的作者认为 *.pxd-files 是公共 API 的一部分,那么他们可以将相应的 pxd-files next to *.so-files into the installation 放入,因此可以使用/扩展模块的 c 接口。

如果他们没有将 pxd 文件放入安装中,那么这个 c 接口很可能是一个实现细节,您不应该使用它,因为它可能会在将来更改,恕不另行通知。

但是,可以冒险手动将必要的 pxd 文件复制到安装中,但首先要确保它是正确的 pxd 版本(即与安装中的 so 文件相同)已建成)。

第二种可能性:

确保使用正确的 pxd 版本的最简单方法是从源代码构建包,即

  • 从 github 下载正确的版本(主版本或最新版本)
  • 致电python setup.py install 或自述文件告诉您的操作

现在,可以通过 include_path 为 cythonize-function 或将其添加到 sys.path 将 include_path 添加到下载的包源中,而不是将 pdx 文件复制到安装中。

或者,正如@BeforeFlight 在 cmets 中指出的那样,可以使用 python setup.py develop(或 pip install -e 相同的文件夹,以便可以将其卸载),并且因为它创建了一个链接而不是复制数据,所以 pxd-将找到文件。


上述解决方案将有助于构建模块,但是分发它是完全不同的故事。

【讨论】:

  • 可以改用python setup.py develop。因此安装将与克隆的 github repo 链接,并且所有.pxd 文件都可以访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多