首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python / C-Api:向模块添加类

Python / C-Api:向模块添加类
EN

Stack Overflow用户
提问于 2012-04-24 02:22:35
回答 2查看 1.1K关注 0票数 2

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

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

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

代码语言:javascript
复制
class Test:
    someVar=1

这样它就会被添加到一个给定的模块中,然后可以作为mymodule.Test进行访问

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-25 21:14:53

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

方式1

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-04-25 10:35:48

要将某些内容放入模块中,只需对其进行赋值。假设class Test定义如上,要将其附加到该名称下的模块mymodule,只需编写

代码语言:javascript
复制
mymodule.Test = Test

就这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10286083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档