gpt4 book ai didi

python - 你能导入一个 .so 文件吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:42 24 4
gpt4 key购买 nike

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

当我尝试cimport tissue_classifier 文件时,它给我的错误是找不到tissue_classifier.pxd 文件,这是有道理的因为它是 .so 格式。抱歉,如果这是一个愚蠢的问题,我只是有一段时间没弄清楚。

最佳答案

不,不能导入 *.so 文件。

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

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

那么可以做什么呢?


第一种可能:

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

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

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

第二种可能:

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

  • 从 github 下载正确的版本(主版本或最新版本)
  • 调用 python setup.py install 或 README 告诉您的操作

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

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


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

关于python - 你能导入一个 .so 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56776685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com