gpt4 book ai didi

python - 单线程 C 程序中 Py_Finalize (python 2.5) 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:01 24 4
gpt4 key购买 nike

在下面这个 hello world C 程序中,我同时扩展和嵌入了 Python。

spam.c:

#include <Python.h>

static PyObject *
spam_echo(PyObject *self, PyObject *args) {
const char *command;
int sts;

if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = printf("%s\n", command);
return Py_BuildValue("i", sts);
}

static PyMethodDef SpamMethods[] = {
{"echo", spam_echo, METH_VARARGS, "Prints passed argument"},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initspam(void) {
(void) Py_InitModule("spam", SpamMethods);
}

int main(int argc, char *argv[]) {
PyObject *args;
PyObject *arg;
PyObject *result;
PyObject *moduleName;
PyObject *module;
PyObject *func;

Py_SetProgramName(argv[0]);
Py_Initialize();
initspam();

PyRun_SimpleFile(fopen("foo.py", "r"), "foo.py");

moduleName = PyString_FromString("__main__");
module = PyImport_Import(moduleName);
Py_DECREF(moduleName);
if (!module) {
return 1;
}

func = PyObject_GetAttrString(module, "foo");
Py_DECREF(module);
if (!func || !PyCallable_Check(func)) {
return 1;
}

args = PyTuple_New(1);
arg = Py_BuildValue("s", "hello world");
PyTuple_SetItem(args, 0, arg);

result = PyObject_CallObject(func, args);
Py_DECREF(arg);
Py_DECREF(args);
Py_DECREF(func);

printf("== before\n");
Py_Finalize();
printf("== after\n");
}

这里是调用的 Python 程序:

foo.py:

#!/usr/bin/python

import spam

def foo(cmd):
spam.echo(cmd)

我用

编译
gcc spam.c -I/usr/include/python2.5/ -lpython2.5

使用 GCC 4.2.4-1ubuntu4,我在 Ubuntu Hardy 上使用 python2.5-dev 包。

基本上,我在 Py_Finalize 有一个段错误,如输出所示:

hello world
== before
Segmentation fault

最佳答案

交换行 Py_DECREF(args);Py_DECREF(arg); 解决了这个问题。段错误是在 Py_DECREF(args) 已被释放后访问 arg 的结果。

关于python - 单线程 C 程序中 Py_Finalize (python 2.5) 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com