【问题标题】:Python / C-Api: Add class to modulePython / C-Api:向模块添加类
【发布时间】:2012-05-04 09:23:51
【问题描述】:

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

由于我不希望用户安装任何额外的 python 模块,并且由于我不需要在嵌入式 python 解释器之外重用我的代码,所以如果可以通过Py_InitModule() 和然后向创建的模块添加一个硬编码的 Handler 子类(硬编码的意思是:在运行时添加,但实际上是一个 const 字符串,它总是在初始化时被解释)。

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

class Test:
    someVar=1

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

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

【问题讨论】:

  • 您在创建类或将其添加到模块中需要帮助吗?
  • @IgnacioVazquez-Abrams 将其添加到模块中

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


【解决方案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);

【讨论】:

    【解决方案2】:

    要将某些东西放入模块中,只需分配它。假设类 Test 定义如上,将其附加到该名称下的模块 mymodule 中,只需编写

    mymodule.Test = Test
    

    就是这样。

    【讨论】:

    • 虽然这在导入所需模块时有效,但在刚刚调用Py_InitModule()时不起作用
    猜你喜欢
    • 2018-06-30
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多