具有动态大小的Python C扩展类
Python C-extension class with a dynamic size
我尝试编写包含python类的C扩展。
此类将文件名作为构造函数的参数fname
,然后将该文件加载到内存并作为配置存储。
下面我有:
typedef struct {
PyObject_HEAD
XmlConfig m_cfg;
} PyAgent;
static int PyAgent_init(PyAgent *self, PyObject *args) {
const char *fname;
if (!PyArg_ParseTuple(args, "s", &fname)) {
return NULL;
}
self->m_cfg.Load(fname);
return 0;
}
static PyTypeObject PyAgentType = {
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
"classify.Agent", /* tp_name */
...
}
...
当我尝试加载文件时,出现分段错误。据我所知,之所以会发生这种情况,是因为PyAgent struct
的对象大小由于文件的内存分配而增加。
我尝试过使用PyObject_VAR_HEAD
宏,但没有帮助。
你能给出一个线索或类似的例子吗?
也许self->m_cfg
需要先初始化?您正在对其调用C++方法,但没有首先调用其构造函数。结构是由C代码分配的,而不是C++,所以它不知道需要构造这个字段。
有一些方法可以手动调用构造函数(如果我没记错的话,类似于new(&self->m_cfg) XmlConfig()
),但最简单的方法可能是使用字段XmlConfig *cfg
,并根据需要使用C++运算符new
和delete
(后者将放在tp_dealloc
中)的常用语法来分配和释放它。
相关文章:
- C++返回 Numpy 数组的 Python 扩展模块
- 我应该包含什么来制作 boost.python 扩展?
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- Python & C-C++ 扩展模块案例段故障
- 带有CMake和SetupTools的Python 2.7 C++扩展
- Python 和 C++ (Pybind11):Python 扩展模块导入错误
- Python 扩展中错误,C++ 中的 SFML
- 在 Linux 上从 Visual Studio Code 调试 Python C++ 扩展
- 在Windows元组上构建64位Python扩展:未声明的标识符
- 在用 C++ 编写的 Python 3 扩展中,如何将 wstring 对象传递给 Python 代码
- 如何改进 Python C 扩展文件行读取
- 编译 PythonService.cpp来自 win32 Python 扩展构建
- 如何修复"UnicodeDecodeError:"utf-8"编解码器无法解码字节时使用Python C扩展?
- 如何使用纯Python扩展API(Python3)包裹C 对象
- Python 扩展:对 C 部分和 C++ 部分使用不同的编译器标志
- 如何导入或安装预构建的Python扩展模块(C )(即未通过Setuptools编译的库)
- 基于python版本的C++python扩展的输出差异
- Python C++扩展 - 内存泄漏或访问冲突
- Python 扩展方法的分段错误
- 如何在通过python扩展访问的C++库中捕获AddressSanitizer引发的错误