问题标签 [python-bindings]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
582 浏览

c++ - 调试分段错误。需要帮助

运行代码以使用 gdb 进行调试时出错: https ://pastebin.ubuntu.com/p/PxrKVGmmTQ/

Python 堆栈跟踪: https ://pastebin.ubuntu.com/p/zWz5KBdhSZ/

线程信息: https ://pastebin.ubuntu.com/p/TYBnd3RG78/

python代码中的当前线程: https ://pastebin.ubuntu.com/p/TjvGGvGGYG/

用于调试的 GDB 函数(按顺序):

我正在运行一个带有 python 绑定的自定义 c++ 库。.so(共享对象)文件正在动态链接到 python 程序。python 文件正在导入自定义 c++ 库。当我使用运行python文件时python3 filename.py收到错误:分段错误(核心转储)我尝试使用gdb for python调试此错误。我需要帮助来了解上述链接所指向的内容以及如何解决此问题。

0 投票
2 回答
373 浏览

python - 使用 CFFI/Cython 使用 python 包装 C 代码

我正在开发一个项目,该项目需要我在 Python 中为我需要从 Python 调用的 C 库创建一些包装器。对于上下文,我使用的 C 库是一堆头文件 (.h) 和静态链接库文件 (.a)

我决定使用 CFFI 或 Cython 来完成我的工作。对于 CFFI -使用 CFFI 连接 C 代码,我遵循了与此类似的示例,对于 Cython -通过使用 Cython 包装您的 C 库可从 Python 调用它。现在我在这两个模块中尝试过的小示例程序或多或少都有以下步骤

  • 创建接口代码以调用 C API
    • 在 CFFI 中,它是一个 python 文件,用于声明所需的 C 函数和头文件
    • 在 Cython 中,它是一个 .pyx 文件和对 setup.py 的修改
  • 构建接口代码以生成.so用于接口胶水代码的文件。
  • .so通过从文件中导入接口库,从不同的 python 脚本调用包装函数。

现在,这对我来说非常有效。但是,我必须在该过程中经历两个执行步骤(生成.so文件,然后实际运行 python 脚本并调用 C API)。

我需要知道是否有办法在一个执行步骤中完成上述所有操作。就像,我想运行我的最终 python 脚本,它应该构建接口代码并在一次执行中即时导入它

有关更多上下文,我尝试了 SWIG,但无法找到一种方法来.a用它包装静态链接库。ctypes 也是如此。

0 投票
1 回答
822 浏览

python - 如何将异常与 pybind11 中的自定义字段和构造函数绑定,并且仍然让它们作为 python 异常起作用?

这似乎是 pybind11 中的一个已知限制。我通读了所有文档,无论错误报告似乎适用,以及我可以在 pybind11 gitter 中找到的所有内容。我在 C++ 中有一个自定义异常类,其中包含自定义构造函数和字段。这种类的一个非常基本的例子,修剪空间是在这里:

我目前有将它绑定到 python 中的 python 绑定代码,但它是自定义生成的,由于它的简单性和编译速度,我们更愿意使用 pybind11。

将异常绑定到 pybind11 的默认机制如下所示

这将在 C++ 异常和 python 异常之间创建一个自动转换,并将what()c++ 异常的值转换为messagepython 异常的值。但是,来自 c++ 异常的所有额外数据都将丢失,如果您尝试在 python 中抛出异常并在 c++ 中捕获它,则无法将其与任何额外数据一起抛出。

你可以使用 将额外的数据绑定到 python 对象上attr,我什至走上了尝试扩展 pybind11:exception 类的路径,以便更容易地将自定义字段添加到异常中。

def为异常添加了一个功能,类似于使用class_. 使用它的天真方法不起作用

BadData因为在 c++ 和 python 中没有自动翻译。您可以尝试通过绑定 lambda 来解决此问题:

那里也失败了,obj.cast因为没有自动转换。基本上,由于没有地方存储 c++ 实例,因此我找不到这种方法的真正可行的解决方案。此外,我根本找不到绑定自定义构造函数的方法,这使得 python 上的可用性非常弱。

下一次尝试是基于 pybind11 中的建议,您可以将 python 异常类型用作元类,class_并让 python 将其识别为有效异常。我尝试了这种方法的多种变体。

还有更多我没有保存的东西。但总体结果是 1) 它被完全忽略或 2) 编译失败或 3) 它编译然后在尝试创建实例时立即出现 segfaulted 或 ImportError'd。也可能有一个在模块导入时出现段错误。这一切都模糊在一起。也许有一些神奇的公式可以使这样的事情起作用,但我找不到它。从我对 pybind11 内部的阅读来看,我不相信这样的事情实际上是可能的。从原始 python 类型继承似乎不是它允许你做的事情。

我尝试的最后一件事似乎很聪明。我做了一个python异常类型

然后让我的 pybind11class_继承。

但这也在导入时出现了段错误。所以我基本上回到了这一点。

0 投票
1 回答
166 浏览

python - 为什么 sip 在使用 char * 时会抱怨意外类型“str”?

我正在尝试使用 sip 创建从 c++ 到 python 3.8 的 python 绑定。 我在这里找到了一个简单的示例 并对其进行了更新以使其与我使用 pip 安装的 sip 版本 5.4 一起工作。 详细信息可以在这里找到

我将名称从 word 更改为 basicword,因为我用字符串重写并测试了单词 example。为此,我必须编写一堆特定于 sip 的代码来使字符串库的导入工作,并认为必须有一种更简单的方法。

我的假设是,使用 char * (就像在原始教程中一样)对于 sip 来说会“更容易”,我错过了什么?

我的 sip 文件 basicword.sip:

我的 pyproject.toml 文件:

我的 basicword.h 文件:

我的 basicword.cpp 文件:

我的文件 test.py:

错误信息:

谢谢您的回答!

再见强尼

0 投票
0 回答
161 浏览

python - 如何捆绑外部 CMake 依赖项以生成 Python 包?

我正在尝试为OpenVSlam项目生成 Python 绑定。

我正在使用 PyBind11 并遵循cmake_example模板。

我在我的开发环境中成功构建了该.so文件pybind11_add_module,其中安装了所有依赖项(OpenCV、Protobuf 等库)。该.so文件在此开发环境中运行良好。我可以import sys; sys.path.append('.'); import openvslam_python;正确运行和使用绑定功能。但是,我想将.so文件作为 Python 包提供。

问题是,当我运行python3 setup.py sdist bdist_wheel并尝试wheel在另一个环境(没有安装的依赖项)上安装结果时,它说它找不到依赖项的.so文件。例如,它输出以下错误(在 Docker 容器中):

我想知道是否有一种方法可以将 PyBind11 绑定的依赖项与 CMake(或者可能在setup.py脚本内部)捆绑在一起,以便能够将它们安装在没有安装任何依赖项的环境中。这样,我可以用一个简单的pip install命令在任何地方安装绑定。

0 投票
1 回答
275 浏览

python - Python安装libs文件夹中的python3.lib和python3x.lib有什么区别?

我一直在编译一个 C 库,并在 Python3 库文件中链接 Python 绑定。我一直在使用 python39.lib 文件作为链接,但我想知道“版本化”数字(例如 python3x.lib)与非版本化数字(python3.lib)之间有什么区别。

在回答一个问题时,忘了提到这是使用 gcc 在 Windows 上编译的。

谢谢

0 投票
1 回答
22 浏览

python - 如何使用 ctypes 从使用 apt install 安装的库中调用 C 函数?

我正在尝试使用模块ulc_width_linebreaksunilbrk我的 Python 字符串上的GNUlibunistring(一个 C 函数)调用。在 Ubuntu上可用,我已经安装了. 我打开了一个新的终端窗口并尝试从 Python 导入库。我尝试了以下但全部返回:ctypeslibunistringsudo apt install libunistring2 libunistring-devNone

0 投票
2 回答
146 浏览

python - 如何允许将 NoneType 参数或回调函数传递给 ctypes 中的函数

我已经开始围绕一个 C/C++ 库编写一个非常简单的 Python 绑定,由于法律原因,由于我没有权限,我不能在这里分享。

这包含一个 WINFUNCTYPE() 作为回调,然后可用于装饰一个函数以用作 python 中的回调,并在我绑定的函数的 argtypes 中定义。

这是代码中的样子:

然后我可以像这样使用它

这很好,并且按预期工作,没有问题。

当我做这样的事情时,问题就来了:

我收到以下错误:

这是完全清楚的原因。ctypes 期望将 WINFUNCTYPE() 视为第二个参数,而不是 NoneType,但在我使用的 SDK 的文档中,它指出将回调设置为 NULL 是可能的。但我只是不知道如何解决它,而且我很难在网上或 ctypes 文档中找到任何东西。

这是我第一次尝试绑定 C/C++ 库,如果我忽略了一些明显的东西,请原谅我。如果有人可以帮助我解决这个问题,我将非常感激。

0 投票
0 回答
10 浏览

python - 绘制鼠标位置时不会触发Python activefill矩形

我试图不明白为什么当我在画布中画线表示鼠标位置时,create_rectangle activefill 不起作用

有人可以解释我为什么吗?

非常感谢

0 投票
0 回答
32 浏览

python - 为接受两个参数的 C 模板类创建 Python 绑定

我正在尝试为我的 C-Class 创建一个 python 绑定,它有两个 int 参数。但是,当我尝试创建绑定时,我在 'template<class T, class X1, class X2, class X3> class boost::python::class_ 的模板参数列表中的参数 1 处得到“类型/值不匹配” “ 错误。

这是我试图创建的绑定,这给了我上面提到的错误。

我究竟做错了什么?