在C语言中使用Python日志模块

2024-06-13 06:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我对在C程序中使用Python日志模块很感兴趣。我试着看一下http://docs.python.org/2/extending/embedding.html上的文档,但我还是被卡住了。在

这就是我想要完成的(Python等价物):

import logging, logging.handlers
logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT)
logger.addHandler(socketHandler)
logger.debug("whats up, doc?")

这就是我在C:

^{pr2}$

不过,我不知道如何创建socketHandler。有什么提示吗?谢谢!在


Tags: 模块文档orgimport程序httpdocslogging
1条回答
网友
1楼 · 发布于 2024-06-13 06:25:38

在pythoncapi中,就像在Python中一样,“创建对象”只是调用它的类型

不幸的是,所有的事情都很烦人。根据您希望从C中执行的操作,您可以提供一组在导入时传递给C的助手模块(请参见https://github.com/couchbase/couchbase-python-client/blob/master/couchbase/_bootstrap.py示例)。在

无论如何,Python是一种非常简单的语言,无论是内部还是外部。因此,让我们把它分解。在

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT)

PEP-7表示C89,但在C99中更容易显示:

^{pr2}$

现在,构建套接字处理程序。从C API调用 用PyObject_CallObject完成,它可以处理任何定义了__call__的内容 不过,首先,你需要建立自己的论点。。在

PyObject *sh_ctor = PyObject_GetAttrString(handlers, "SocketHandler");
PyObject *args = Py_BuildValue("(si)", "localhost", DEFAULT_LOGGING_PORT)
PyObject *sh_instance = PyObject_CallObject(sh_ctor, args);

我不会在这里演示如何进行arg构建,甚至不会正确地进行错误检查或引用计数。请注意,在C API中,如果函数失败,它将返回NULL并引发异常(除非另有说明)。在

实际上,我推荐的是计算出在C中实际需要使用多少logging模块,并将该功能封装在一个可以从C调用的更简单的子集中。在

相关问题 更多 >