python - 当 key > size 1 时 PyDic 段错误
问题描述
我正在尝试使用 python 绑定来连接我的 c++ 代码的简单 python 包装器。我目前想返回一个值映射。当我尝试创建字典条目时,我的应用程序在 key > size 1 时出现段错误。即使忽略对象的返回,我仍然会收到错误消息。也只添加“ke”段错误。我已经成功返回了一个带有 {"k": 10} 的字典,但就是这样。
C++:
extern "C" void Test() {
signal(SIGSEGV, handler); // install our handler
PyObject* results = PyDict_New();
printf("Adding k\n");
PyDict_SetItemString(results, "k", PyLong_FromLong(3000));
printf("Adding ke\n");
PyDict_SetItemString(results, "ke", PyLong_FromLong(3000));
printf("Adding key\n");
PyDict_SetItemString(results, "key", PyLong_FromLong(3000));
}
Python:
import ctypes
_test_bench = ctypes.CDLL('<path_to_so>')
_test_bench.Test.argtypes = None
_test_bench.Test.restype = None
def test() -> None:
global _test_bench
_test_bench.Test()
test()
输出:
Adding k
Adding ke
Error: signal 11:
解决方案
您不能使用加载了CDLL
. 你需要使用PyDLL
.
(另外,不要忘记进行引用计数管理。这不是导致崩溃的原因,但它仍然是一个问题。)
推荐阅读
- c - 内存泄漏 - 如何为在另一个结构中作为线程参数传递的 Typdef 结构分配内存?
- android - 了解在旧应用程序中使用 AndroidX 的能力
- ef-core-3.0 - 将脚手架 EF 实体放在与上下文不同的目录中
- flutter - 仅在安装后加载的说明页面
- java - 为什么我会收到“来自注册表 minecraft:block 的未知映射”?
- ios - 本地 UNNotificationRequest 的调度限制
- sql - 从 SQL 到 Spring 的降序从列表中提取第一个(Top)结果
- sql - 将单列转换为多行
- java - 在中缀到后缀转换期间运算符更改为 int
- python - Python beautifulsoup4 库 find_all() 函数问题