PyUnicode_AsUTF8()分段错误

时间:2014-08-22 05:51:28

标签: python c segmentation-fault embedded

#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()获取字符串。 谢谢。

2 个答案:

答案 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() 搭配