Skip to main content
 首页 » 编程设计

Python/C-API : Add class to module

2025年05月04日8qq号

我目前正在尝试将 python 解释器嵌入到我的应用程序中。因为我的应用程序使用 Poco API 进行日志记录,所以我也想通过 python 中的日志记录模块访问它。 对我来说,最简单的方法是提供一组静态函数作为扩展模块来记录消息,然后编写调用这些函数的 Handler 子类。

因为我不希望用户安装任何额外的 python 模块,并且因为我不需要在我的嵌入式 python 解释器之外重用我的代码,所以如果可以通过 Py_InitModule 提供静态函数就太好了() 然后将硬编码的 Handler 子类添加到创建的模块(硬编码意味着:在运行时添加但实际上是一个常量字符串,它总是在初始化时被解释)。

我的问题是我不知道如何解释普通的 python 类定义,例如:

class Test: 
    someVar=1 

以便将其添加到给定模块,然后可访问,例如 mymodule.Test

解决方案可以是纯基于 python 的,也可以使用 python c-api。

请您参考如下方法:

我终于找到了答案: 实际上有两种方法可以在模块的上下文中执行代码

方式一

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* code = Py_CompileString("class Test:\n\tdef __repr__(self):\n\t\treturn 'Hello world'","",Py_file_input); 
PyImport_ExecCodeModule("poco",code); 

此方法的缺点是模块将被重新加载,而这在这个阶段是不需要的。

方式二

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* mainModule = PyImport_AddModule("__main__"); 
 
PyObject* dict = PyModule_GetDict(module); 
PyObject* mainDict = PyModule_GetDict(mainModule); 
 
PyRun_String("def test():\n\tprint 'test'\n",Py_file_input,mainDict,dict);