PyDict_SetItemString 段错误
PyDict_SetItemString segfaults
我正在尝试为 Python3 编写一个简单的 C 扩展,当我尝试将字符串添加到字典时出现段错误。这是我的代码:
#include <stdio.h>
#include <Python.h>
int main() {
PyObject* dict_p = PyDict_New();
char *val = "idjewijjd";
PyObject* val_p = PyUnicode_FromString(val);
const char *key = "dhsjdshj";
for (int j=0; j<8; j++) {
printf("%d\n", PyUnicode_READ_CHAR(val_p,j));
}
int r = PyDict_SetItemString(dict_p, key, val_p);
return 0;
}
我是这样编译的gcc t.c $(python3-config --includes --libs)
和运行。我得到以下输出:
$ ./a.out
105
100
106
101
119
105
106
106
Segmentation fault (core dumped)
这是 gdb 回溯:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff78d9b38 in PyUnicode_InternInPlace () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
(gdb) bt
#0 0x00007ffff78d9b38 in PyUnicode_InternInPlace () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
#1 0x00007ffff78b3818 in PyDict_SetItemString () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
#2 0x0000555555554d7f in main () at t.c:16
我找不到代码本身的错误。我编译错了吗?
您忘记初始化解释器:
Py_Initialize();
嵌入 Python 的程序必须在尝试调用任何 Python 函数之前初始化解释器。这对于由已经初始化的解释器加载的扩展模块不是必需的。
我正在尝试为 Python3 编写一个简单的 C 扩展,当我尝试将字符串添加到字典时出现段错误。这是我的代码:
#include <stdio.h>
#include <Python.h>
int main() {
PyObject* dict_p = PyDict_New();
char *val = "idjewijjd";
PyObject* val_p = PyUnicode_FromString(val);
const char *key = "dhsjdshj";
for (int j=0; j<8; j++) {
printf("%d\n", PyUnicode_READ_CHAR(val_p,j));
}
int r = PyDict_SetItemString(dict_p, key, val_p);
return 0;
}
我是这样编译的gcc t.c $(python3-config --includes --libs)
和运行。我得到以下输出:
$ ./a.out
105
100
106
101
119
105
106
106
Segmentation fault (core dumped)
这是 gdb 回溯:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff78d9b38 in PyUnicode_InternInPlace () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
(gdb) bt
#0 0x00007ffff78d9b38 in PyUnicode_InternInPlace () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
#1 0x00007ffff78b3818 in PyDict_SetItemString () from /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
#2 0x0000555555554d7f in main () at t.c:16
我找不到代码本身的错误。我编译错了吗?
您忘记初始化解释器:
Py_Initialize();
嵌入 Python 的程序必须在尝试调用任何 Python 函数之前初始化解释器。这对于由已经初始化的解释器加载的扩展模块不是必需的。