Python / C-Api:将类添加到模块

时间:2012-04-23 18:22:35

标签: python class python-module python-c-api python-embedding

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

由于我不希望用户安装任何其他python模块,因为我没有要求在嵌入式python解释器之外重用我的代码,如果可以通过{{1}提供静态函数,那将是很好的然后将硬编码的Handler子类添加到创建的模块中(硬编码意味着:在运行时添加,但实际上是一个总是在初始化时解释的const字符串)。

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

Py_InitModule()

以便将其添加到给定模块中,然后可以访问,例如class Test: someVar=1

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

2 个答案:

答案 0 :(得分:1)

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

方式1

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);

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

方式2

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);

答案 1 :(得分:0)

要将某些内容放入模块中,只需指定它即可。假设类Test如上定义,要将其附加到该名称下的模块mymodule,只需编写

即可
mymodule.Test = Test

就是这样。