我有一个名为的 .so 文件tissue-classifier.cpython-37m-x86_64-linux-gnu.so
来自我想要导入的外部库,以便我可以在我的本地类之一中扩展它。由于我正在扩展一个类,因此我需要使用以下命令将其作为扩展类型导入cimport
我想知道这是否可能。如果我用普通的import
声明然后我将留下一个Python编译版本,它不能用于扩展cdef
我当前文件中的类。
当我尝试cimport
the tissue_classifier
文件,它给了我错误tissue_classifier.pxd
找不到文件,这是有道理的,因为它位于.so
格式。抱歉,如果这是一个愚蠢的问题,我只是暂时无法弄清楚这一点。
不可以,无法导入 *.so 文件。
如果有 C/CPP 背景,那么使用以下模型可能最容易理解 pyx/pxd/so-business:
- 由此产生的扩展(
*.so
-file)对应于 C/CPP 世界中的最终工件,它可以是可执行文件、共享对象(*.so
),或库/对象文件集合。如果您只是运行生成的程序,那么它就是您所需要的。例如,您可以使用(并且可能会这样做)CPython 解释器,而无需构建它或拥有其源代码。类似地,如果你有一个二进制扩展(*.so
)你可以导入并使用它,而无需构建它(甚至在你的机器上有相应的 pyx 文件或编译器) - 这是由wheel.
-
*.pyx
对应于 c/cpp 文件,其中包含功能的定义。如果您想从源构建生成的工件,则需要这些文件。在 C/CPP 世界中,此构建过程将通过使用来触发make
或类似的。如果您通过以下方式安装软件包,则需要 pyx 文件python setup.py install
- 对应于调用make
.
-
*.pxd
对应于头文件(h/hpp-files):它描述了生成的so文件中的功能,因此可以重用。例如,仅仅拥有 CPython 解释器不足以构建扩展 - 必须安装开发版本,因此还包括Python.h
&Co。存在于机器上。
那么可以做什么呢?
第一种可能性:
如果包的作者考虑*.pxd
-files是公共API的一部分,那么他们可以放置相应的pxd-files将 *.so 文件旁边的文件放入安装中,因此可以使用/扩展模块的C接口。
如果他们没有将 pxd 文件放入安装中,那么这个 C 接口很可能是一个实现细节,您不应该使用它,因为它将来可能会更改,恕不另行通知。
但是,可以冒险将必要的 pxd 文件复制到安装中,但首先要确保它是正确的 pxd 版本(即与安装中构建的 so 文件相同) 。
第二种可能:
确保使用正确的 pxd 版本的最简单方法是从源代码构建包,即
- 从 github 下载正确的版本(主版本或最新版本)
- calling
python setup.py install
或者自述文件告诉你做什么
现在,无需将 pdx 文件复制到安装中,而是可以通过以下方式将 include_path 添加到下载的包源中include_path
对于 cythonize-function 或将其添加到sys.path
.
或者,正如 @BeforeFlight 在评论中指出的那样,可以使用python setup.py develop
(or pip install -e
相同的文件夹,以便可以卸载),并且因为它创建链接而不是复制数据,所以将找到 pxd 文件。
上述解决方案将有助于构建模块,但分发它是一个完全不同的故事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)