PyUnicode_AsUTF8()引起分段错误

4
#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() 中获取字符串返回值。谢谢。


我没有收到segfault。你用的是哪个版本的gcc?在哪个平台上? - Anthony Kong
我得到了这个错误:"TypeError: bad argument type for built-in operation"。非常奇怪。我正在使用OSX 10.9.4上的llvm gcc(Apple LLVM版本6.0(clang-600.0.45.3))。 - Anthony Kong
顺便提一下,正如我之前提到的,您需要提供更多信息:gcc版本和平台是什么。您可以编辑问题并在那里放置信息。 - Anthony Kong
@AnthonyKong 你也可以试试这个吗?使用相同的编译方法。你有任何错误吗?#include int main(int argc, char *argv[]) { PyObject *pModule; PyObject *pValue; Py_Initialize(); pModule = PyImport_AddModule("__main__"); PyRun_SimpleString("x = \"hello world\""); pValue = PyObject_GetAttrString(pModule, "x"); printf("%s\n", PyUnicode_AsUTF8(pValue)); Py_Finalize(); return 0; } - Henry Wong
也许我有些落后了,我刚发现这个也可以工作。`#include <Python.h>int main (int argc, char *argv[]) { PyObject *pModule; PyObject *pValue;Py_Initialize ();pModule = PyImport_AddModule ("main");PyRun_SimpleString ("import uuid; x = str(uuid.uuid4())");pValue = PyObject_GetAttrString (pModule, "x");printf ("%s\n", PyUnicode_AsUTF8 (pValue));Py_Finalize ();return 0; }` - Henry Wong
显示剩余4条评论
2个回答

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

我真的不知道发生了什么。


这个版本可以工作,但我想找出背后的原因...请看上面评论中的我的Hello world,它对我有效,所以我的第一段代码应该可以工作,但它没有。 - Henry Wong

0

我在使用PyUnicode_AsUTF8时遇到了Fatal Python error: XXX block stack underflow的错误。

对我来说,诀窍在于该函数使用Python API分配内存,因此必须使用cpython.mem中的PyMem_Free()释放内存。

malloc()free()相对应,PyMem_Malloc()PyMem_Free()相对应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接