您可以导入.so文件吗?

时间:2019-06-26 15:48:22

标签: python import compilation cython .so

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

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

1 个答案:

答案 0 :(得分:1)

否,无法导入* .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解释器不足以构建扩展-必须安装dev-version,还必须安装包含Python.h&Co。出现在机器上。

那该怎么办?


第一种可能性:

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

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

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

第二种可能性:

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

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

现在,与其将pdx文件复制到安装中,不如通过cythonize功能通过include_path将include_path添加到下载的软件包源中,或者将其添加到sys.path中。

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


以上解决方案将有助于构建模块,但是分发模块则完全不同。