gpt4 book ai didi

python - C python 扩展中的段错误

转载 作者:太空狗 更新时间:2023-10-29 16:00:11 28 4
gpt4 key购买 nike

我正在为 python3.7 编写一个 C 扩展模块。我有一个简单的结构,如 PyObject:

typedef struct {
PyObject_HEAD
double attacker;
double victim;
double game_hardness;
int inflation;
} RatingSystem;

和初始化器:

static int 
RatingSystem_init(RatingSystem *self, PyObject *args, PyObject *kwargs) {
double kek;
static char *kwargs_list[] = {"attacker", "victim", "game_hardness", "inflation"};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|$dddi", kwargs_list,
&self->attacker, &self->victim,
&self->game_hardness, &self->inflation)) {
return -1;
}

printf("Success\n");
return 0;
}

如果我在 Mac OS 的 python 3.7.3 下运行它,一切正常,但是如果我切换到 alpine 3.10 python docker image (python:3.7-alpine),在下面的初始化中:

import rating_system
rs = rating_system.RatingSystem(attacker=1000.0, victim=1000.0, game_hardness=1300.0, inflation=1)

我得到段错误。在 gdb 下运行显示如下:

Program received signal SIGSEGV, Segmentation fault.
vgetargskeywords (args=0x7f87284f0050, kwargs=0x7f87284e0a00, format=<optimized out>, format@entry=0x7f8728301000 "|$dddi", kwlist=kwlist@entry=0x7f8728303020 <kwargs_list>, p_va=p_va@entry=0x7ffeeee6e4e0,
flags=flags@entry=2) at Python/getargs.c:1640
1640 Python/getargs.c: No such file or directory.

如果我从 init 中删除 inflation,代码也可以工作,即这段代码:

static int 
RatingSystem_init(RatingSystem *self, PyObject *args, PyObject *kwargs) {
static char *kwargs_list[] = {"attacker", "victim", "game_hardness"};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|$ddd", kwargs_list,
&self->attacker, &self->victim,
&self->game_hardness)) {
return -1;
}

printf("Success\n");
return 0;
}

有效。

我的初始化有什么问题吗?我尝试对最后一个参数使用不同的类型,但没有成功。

最佳答案

根据docs对于 PyArg_ParseTupleAndKeywordskeywords 参数需要一个以 NULL 结尾的关键字参数名称数组。

向您的 kwargs_list 添加一个额外的 NULL 元素:

static char *kwargs_list[] = {"attacker", "victim", "game_hardness", NULL};

关于python - C python 扩展中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57031301/

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