"你可以导入一个.so文件吗?"

2024-05-23 13:50:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当我试图cimport文件时,tissue_classifier会给我一个错误:找不到{}文件,这是有意义的,因为它是.so格式的。抱歉,如果这是个愚蠢的问题,我只是有一段时间没能弄明白。在


Tags: 文件gnuimport版本类型solinux错误
1条回答
网友
1楼 · 发布于 2024-05-23 13:50:25

不,不能cimported*.so文件。在

如果有C/CPP背景,那么pyx/pxd/so业务显然最容易理解,使用以下模型:

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

那么我们能做些什么呢?在


第一种可能性:

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

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

但是,可以冒这个风险,将必要的pxd文件复制到安装中,但是首先要确保它是正确的pxd版本(也就是说,在安装中生成so文件时使用的版本相同)。在

第二种可能性:

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

  • 从github下载正确版本(主版本或最新版本)
  • 调用python setup.py install或自述文件要求您执行的操作

现在,可以通过include_path为cythonize函数或通过将其添加到sys.path中,而不是将pdx文件复制到安装中。在

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


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

相关问题 更多 >