您可以导入 .so 文件吗?

2023-11-30

我有一个名为的 .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(使用前将#替换为@)

您可以导入 .so 文件吗? 的相关文章

随机推荐

  • jQuery Sortable - 事件被调用太多次

    我有一个 x 类列表 该列表中有许多 y 类列表 可以将项目从任何子列表拖动到任何其他子列表 也可以安排子列表本身的顺序 我正在努力应对通过可排序触发的事件 接收 仅当某些内容从其他地方带入列表时才会触发 因此对于在子列表中排列项目或排列子
  • 为什么我的绝对/固定位置元素没有位于我期望的位置?

    我刚刚学习CSS中的定位 根据我发现有用的文章 我开始尝试 使用以下代码 我无法理解为什么绝对灰盒 div 位于其相对父级之外 我预计灰盒将位于容器的左上角 container background lightblue position r
  • Swift 泛型和协议不适用于 UIKit [可能的错误]

    TL DR gt 滚动到底部 在尝试使用 Swift 面向协议编程来标记 Apple 时 我在尝试实现类之间的委托模式时偶然发现了以下问题 我将从这个例子开始 protocol PhotoHandlerParent class UIView
  • 获取图标128*128文件类型C#

    我需要获取文件类型 doc 或 txt 的图标 它的大小应为 128 128 并以良好的质量保存为 png 或 ico 文件 I used Icon ico Icon ExtractAssociatedIcon d 1 txt pictur
  • 如何从 python 集中删除自定义对象的实例?

    我正在用 python 进行一些基本的卡 牌组操作 下面你可以看到我的 Card 类和 Deck 类 假设我知道有些牌已经死了 并且想将它们从牌组中删除 import itertools SUIT LIST h s d c NUMERAL
  • 设置 Java 线程的优先级

    我有一个在几个线程中运行的程序 主线程与其他线程共享一个对象 在主线程中我调用了 synchronized obj do stuff 我怀疑主线程饥饿并且无法访问obj 如何提高主线程的优先级或者默认情况下它已经高于其他线程 Thread
  • Java:Swing:按下按钮后隐藏框架

    我在 java 框架中有一个按钮 按下该按钮时 它会从文本字段读取一个值 并使用该字符串作为尝试连接到串行设备的端口名称 如果连接成功 该方法返回 true 否则返回 false 如果它返回 true 我希望框架消失 然后将出现其他类中指定
  • 使用 OpenCSVSerde 时,hive 无法读取字符斜杠

    我在 hdfs 中的文件顶部定义了一个表 我正在使用 OpenCSV Serde 从文件中读取 但是 数据中的 斜杠字符在最终结果集中被省略 是否有我没有正确使用的 hive serde 属性 根据文档 escapeChar 应该可以解决这
  • 错误:被调用的对象不是函数或函数指针

    我有以下代码 z x y 1 printf d z z x y 2 x y printf d z z x y x y printf d z z 2 x y x y printf d z 我收到此错误消息 10 11 error called
  • Python 中的八皇后问题

    Python 中的 8 皇后问题 你好 我才开始教Python 所以有人可以解释下面写的代码 在互联网上找到的 吗 有些代码对我来说很复杂 请解释一下 谢谢 问题就在代码附近 BOARD SIZE 8 def under attack co
  • 笔画可以用作 SVG 中剪辑路径的一部分吗?

    我正在编写 MuPDF 的 SVG 输出 并且遇到了 SVG 功能的限制 我想我会在这里问 以防这是已知解决方法的已知问题 或者万一我做了一些愚蠢的事情 我有以下 SVG
  • 如何将行转换为基于重复列的数据?

    我正在尝试获取如下所示的数据集 并将记录转换为以下格式 生成的格式将有两列 一列用于旧列名称 一列用于值 如果有 10 000 行 那么新格式中应该有 10 000 组数据 我对所有不同的方法持开放态度 Excel 公式 sql mysql
  • 如何在 Python 中使用 OpenCV 拉直图像的旋转矩形区域?

    下面的图片会告诉你我想要什么 我有图像中矩形的信息 宽度 高度 中心点和旋转度 现在 我想编写一个脚本来剪切它们并将它们保存为图像 但也要拉直它们 例如 我想从图像内部显示的矩形转到外部显示的矩形 我正在使用 OpenCV Python P
  • 查找二叉树中最大独立集的大小 - 为什么错误的“解决方案”不起作用?

    这是一个类似问题的链接 有一个很好的答案 Java算法寻找二叉树中最大的独立节点集 我想出了一个不同的答案 但我的教授说这行不通 我想知道为什么 他不回复电子邮件 问题 给定一个包含 n 个整数的数组 A 其索引从 0 开始 即A 0 A
  • python 是否有类似于 __setattr__ 但针对 python 类的方法?

    现在 设置属性 仅适用于实例 课堂上有类似的方法吗 我问这个问题是因为当用户在类中定义属性时 我想按顺序收集已定义属性的列表 如下所示 class CfgObj object fields def setattr self name val
  • HandlerInterceptorAdapter 和 Zuul 过滤器

    可以添加一个HandlerInterceptorAdapter with Zuul配置 我需要拦截对特定资源的请求 但我想是因为我有Zuul过滤器配置 拦截器永远不会被调用 可以这样做吗 我也试图达到同样的目的 我们有一些 Spring M
  • 获取垃圾输出 Java [重复]

    这个问题在这里已经有答案了 我正在尝试用 Java 实现一个构造函数 我不知道我是否做错了什么 但我不断收到垃圾输出 这是我试图为其赋值的变量 private static Employee employee 这就是我尝试分配它的方式 em
  • AttributeError:'tuple'对象没有属性'encode' - MySQLdb Python

    我正在用 MySQL 编写 Python 代码 我的数据库架构如下 id name 以下是我的代码的一部分 cursor self conn cursor query SELECT name FROM TABLENAME WHERE id
  • 正则表达式 - 精确匹配一个标签

    我有一个正则表达式来从 HTML 字体标签中提取文本 font face font 在我有一些嵌套的字体标签之前 这一切都很好 而不是匹配 font face Fett font 字符串的结果 font face Fett font u U
  • 您可以导入 .so 文件吗?

    我有一个名为的 so 文件tissue classifier cpython 37m x86 64 linux gnu so来自我想要导入的外部库 以便我可以在我的本地类之一中扩展它 由于我正在扩展一个类 因此我需要使用以下命令将其作为扩展