我有一个来自外部库的名为tissue-classifier.cpython-37m-x86_64-linux-gnu.so
的.so文件,我想导入该文件,以便在我的一个本地类中扩展它。因为我正在扩展一个类,所以需要使用cimport
将其作为扩展类型导入,我想知道这是否可能。如果我使用一个普通的import
语句,那么我将得到一个Python编译版本,该版本不能用于扩展当前文件中的cdef
类。在
当我试图cimport
文件时,tissue_classifier
会给我一个错误:找不到{.so
格式的。抱歉,如果这是个愚蠢的问题,我只是有一段时间没能弄明白。在
不,不能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版本最简单的方法是从源代码构建包,即
python setup.py install
或自述文件要求您执行的操作现在,可以通过
include_path
为cythonize函数或通过将其添加到sys.path
中,而不是将pdx文件复制到安装中。在或者,正如@beforefright在评论中指出的那样,可以使用}同一个文件夹,这样就可以卸载它),而且因为它创建了一个链接而不是复制数据,所以pxd文件就会被找到。在
python setup.py develop
(或者{上述解决方案将有助于构建模块,但分发它是完全不同的情况。在
相关问题 更多 >
编程相关推荐