#include <Python.h>
int
main (int argc, char *argv[])
{
PyObject *pName, *pModule, *pFunc;
PyObject *pValue;
Py_Initialize ();
pName = PyUnicode_FromString ("uuid");
pModule = PyImport_Import (pName);
Py_DECREF (pName);
pFunc = PyObject_GetAttrString (pModule, "uuid4");
pValue = PyObject_CallObject (pFunc, NULL);
printf ("%s\n", PyUnicode_AsUTF8 (pValue));
Py_Finalize ();
return 0;
}
编译
gcc test.c `python3.4-config --cflags --ldflags`
我得到Segmentation fault
。
如何解决这个问题?
我想要的是从uuid4()
获取字符串。
谢谢。
答案 0 :(得分:0)
我可以成功地通过一些修改来编译并打印出值:
#include <Python.h>
#include <stdio.h>
int
main (int argc, char *argv[])
{
PyObject *pName, *pModule, *pFunc;
PyObject *pValue;
Py_Initialize ();
pName = PyUnicode_FromString ("uuid");
pModule = PyImport_Import (pName);
Py_DECREF (pName);
pFunc = PyObject_GetAttrString (pModule, "uuid4");
pValue = PyObject_CallObject (pFunc, NULL);
PyObject_Print(pValue, stdout, Py_PRINT_RAW); // my change
printf ("\n"); // make the printout look nicer
Py_Finalize ();
return 0;
}
这是输出:
$ ./a.out
bd94cb52-9278-41a8-bc5a-ad05eff91188
我认为问题的原因很可能是这样的:编译python的编译器与编译测试程序test.c
的编译器不同。您可以找到正确版本的gcc来编译代码,或者只是使用当前的gcc编译器重新编译python3.4。
对于您的原始版本的test.c,它会在我的MBP上出现此错误:
$ ./a.out
(null)
Exception ignored in: <module 'threading' from '/usr/local/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py'>
Traceback (most recent call last):
File "/usr/local/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 1292, in _shutdown
t = _pickSomeNonDaemonThread()
File "/usr/local/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 1299, in _pickSomeNonDaemonThread
for t in enumerate():
File "/usr/local/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 1269, in enumerate
return list(_active.values()) + list(_limbo.values())
TypeError: bad argument type for built-in operation
我真的不知道发生了什么。
答案 1 :(得分:0)
我使用 Fatal Python error: XXX block stack underflow
得到了 PyUnicode_AsUTF8
。
对我来说,诀窍是该函数使用 Python API 分配内存,因此必须使用 cpython.mem 中的 PyMem_Free()
释放。
malloc() 与 free() 搭配,PyMem_Malloc() 与 PyMem_Free() 搭配