我要导入一个来自外部库的名为tissue-classifier.cpython-37m-x86_64-linux-gnu.so
的.so文件,以便可以在我的一个本地类中对其进行扩展。由于我正在扩展一个类,因此我需要使用cimport
将其作为扩展类型导入,我想知道这是否有可能。如果我使用普通的import
语句,那么将剩下一个Python编译版本,该版本无法用于在当前文件中扩展cdef
类。
当我尝试cimport
tissue_classifier
文件时,它给我一个错误,因为找不到tissue_classifier.pxd
文件,这是合理的,因为它是.so
格式。抱歉,如果这是一个愚蠢的问题,我只是暂时无法弄清楚。
答案 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版本的最简单方法是从源代码构建程序包,即
python setup.py install
或自述文件告诉您做什么现在,与其将pdx文件复制到安装中,不如通过cythonize功能通过include_path
将include_path添加到下载的软件包源中,或者将其添加到sys.path
中。
或者,如@BeforeFlight在注释中指出的,可以使用python setup.py develop
(或pip install -e
相同的文件夹,以便将其卸载),并且因为它创建链接而不是复制数据,将找到pxd文件。
以上解决方案将有助于构建模块,但是分发模块则完全不同。