2012-04-23 64 views
2

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

由于我不想让用户安装任何额外的Python模块,并且因为我没有要求在我的嵌入式Python解释器之外重新使用我的代码,所以如果可以通过Py_InitModule()提供静态函数然后将硬编码的Handler子类添加到创建的模块中(硬编码意味着:在运行时添加,但实际上是一个在初始化时始终解释的常量字符串)。

我的问题是,我不知道如何解释一个正常的Python类的定义,如:

class Test: 
    someVar=1 

,这样它被添加到一个给定的模块,然后accesable作为,如mymodule.Test

一解决方案可以是纯粹的基于python或使用python c-api。

+0

你需要帮助创建类或将其添加到模块? – 2012-04-25 02:42:47

+0

@ IgnacioVazquez-Abrams将它添加到模块中 – Paranaix 2012-04-25 11:43:43

回答

1

我终于找到了的answere自己: 实际上有2种方法中的模块的上下文中执行的代码

方式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); 
0

把东西放入模块中,只需指定它。假设类Test如上所述,要将其附加到该名称下的模块mymodule,只需编写

mymodule.Test = Test 

就是这样。

+0

虽然这在所需模块导入时起作用,但只有在调用了'Py_InitModule()'时才起作用。 – Paranaix 2012-04-25 11:54:35