gpt4 book ai didi

python - 使用 C 扩展 Python 错误 : Segmentation Fault: 11 in Python [MacOS X]

转载 作者:行者123 更新时间:2023-12-01 01:49:17 25 4
gpt4 key购买 nike

我用C语言编写了一个扩展模块,名称为extmodule.c,其代码如下:

#include <Python.h>

//Define a new exception object for our module
static PyObject *extError;

static PyObject* ext_cpu(PyObject* self, PyObject *args)
{
int pid;
int sts=0;

//We expect at least 1 argument to this function
if(!PyArg_ParseTuple(args, "i", &pid))
{
return NULL;
}


printf("Hello, from C World! Pid: %i", pid);
sts=pid;

return Py_BuildValue("i", sts);
}

static PyMethodDef ext_methods[] = {
//PythonName, C-FunctionName, argument_presentation, description
{"cpu", ext_cpu, METH_VARARGS, "Print cpu consumption of a particular process with pid"}
};

PyMODINIT_FUNC
PyInit_ext(void)
{
PyObject *m;

m = PyModule_Create(&ext_methods);
if (m == NULL)
return NULL;

extError = PyErr_NewException("spam.error", NULL, NULL);
Py_INCREF(extError);
PyModule_AddObject(m, "error", extError);
return m;
}

之后,我创建了一个 setup.py 来在我的 python 程序中构建和安装扩展文件,setup.py 的代码如下:

from distutils.core import setup, Extension

module1 = Extension('ext',
include_dirs = ['/usr/local/include'],
libraries = ['pthread'],
sources = ['extmodule.c'])

setup (name = 'ext',
version = '1.0',
description = 'This is a C extension for Python program',
author = 'Somdip Dey',
url = '',
ext_modules = [module1])

现在,在命令提示符下,我使用以下命令构建了 setup.py:

>> python setup.py build

running build running build_ext

building 'ext' extension gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/somdipdey/ anaconda3/include -arch x86_64 -I/Users/somdipdey/anaconda3/include -arch x86_64 -I/usr/local/include -I/Users/somdipdey/anaco nda3/include/python3.6m -c extmodule.c -o build/temp.macosx-10.7-x86_64-3.6/extmodule.o extmodule.c:34:25: warning: incompatible pointer types passing 'PyMethodDef (*)[1]' to parameter of type 'struct PyModuleDef *' [-Wincompatible-pointer-types] m = PyModule_Create(&ext_methods); /Users/somdipdey/anaconda3/include/python3.6m/modsupport.h:158:26: note: expanded from macro 'PyModule_Create' PyModule_Create2(module, PYTHON_API_VERSION) ^~~~~~ /Users/somdipdey/anaconda3/include/python3.6m/modsupport.h:150:60: note: passing argument to parameter here PyAPI_FUNC(PyObject ) PyModule_Create2(struct PyModuleDef, ^ 1 warning generated. gcc -bundle -undefined dynamic_lookup -L/Users/somdipdey/anaconda3/lib -arch x86_64 -L/Users/somdipdey/anaconda3/lib -arch x86 _64 -arch x86_64 build/temp.macosx-10.7-x86_64-3.6/extmodule.o -L/Users/somdipdey/anaconda3/lib -lpthread -o build/lib.macosx- 10.7-x86_64-3.6/ext.cpython-36m-darwin.so

>> python setup.py install

安装命令工作正常,但构建命令给出了 1 个警告。现在,当我尝试在 python 程序中导入 ext 并使用函数 ext.cpu(integer_value) 时,程序给出以下错误:

Segmentation Fault: 11

知道是什么原因导致了这个问题以及如何解决它吗?

最佳答案

警告准确地告诉您出了什么问题:您将 PyMethodDef (*)[1] 传递给 PyModule_Create,而它期望的是 PyModuleDef * 。这些是完全不相关的类型。您收到的段错误就像 C 版本的 TypeError

You need to create a module definition table ,并将那个传递给PyModule_Create .

<小时/>

如果你解决了这个问题,你可能会或可能不会有另一个段错误,或垃​​圾数据,或退出时神秘的​​段错误,因为你的方法表缺少末尾的空行。 C 数组不像 Python 列表那样知道它们的大小,因此使用它们的代码要么需要在单独的变量中传递大小,要么在最后一个槽中使用一些“哨兵”值。 PyMethodDef 使用后一种解决方案。

<小时/>

所以:

static PyMethodDef ext_methods[] = {
//PythonName, C-FunctionName, argument_presentation, description
{"cpu", ext_cpu, METH_VARARGS, "Print cpu consumption of a particular process with pid"},
{NULL, NULL, 0, NULL}
};

static struct PyModuleDef ext_module = {
PyModuleDef_HEAD_INIT,
"ext",
"Extension module that does stuff",
-1,
ext_methods
};

PyMODINIT_FUNC
PyInit_ext(void)
{
PyObject *m;

m = PyModule_Create(&ext_module);
// the rest is the same as before

通过这些更改,您的模块将在没有警告的情况下构建,并且:

>>> import ext
>>> ext.cpu(23)
Hello, from C World! Pid: 23
>>> ^D

...一切正常。

(嗯,那里可能存在内存泄漏,但这是一个单独的问题......)

关于python - 使用 C 扩展 Python 错误 : Segmentation Fault: 11 in Python [MacOS X],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900279/

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