3

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で試みたものです:

PyObject *logging, *get_logger, *pValue, *set_level, *strargs;
*logging = PyImport_ImportModule("logging")
*get_logger = PyObject_GetAttrString(logging, "getLogger")
*pValue = PyObject_CallObject(get_logger, NULL)
*set_level = PyObject_GetAttrString(logging, "setLevel")
*strargs = PyString_FromString("logging.DEBUG")
pValue = PyObject_CallObject(set_level, strargs);

ただし、socketHandler の作成方法がわかりません。ヒントはありますか?ありがとう!

4

1 に答える 1

1

Python C API では、Python と同様に、「オブジェクトの作成」はその型を呼び出すだけです。

残念ながら、すべてgetattrを C で行うのは本当に面倒です。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 で表示する方が簡単です。

PyObject *logging = PyImport_ImportModule("logging");
PyObject *handlers = PyObject_GetAttrString(logging, "handlers");

次に、ソケット ハンドラをビルドします。C API から、PyObject_CallObject を使用して何かを呼び出すことができます。これは、__call__ 最初に定義されたものすべてに対して機能しますが、thr 引数を構築する必要があります。

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

ここでは、引数の作成方法や、適切なエラー チェックや参照カウントの方法については説明しません。C API では、関数が失敗すると、返さNULLれて例外が発生することに注意してください (特に明記されていない限り)。

実際に私がお勧めするのはlogging、C から実際に使用する必要があるモジュールの量を把握し、その機能を C から呼び出すことができるより単純なサブセットにラップすることです_bootstrap.py。上記のリンク先のモジュールを参照してください。

于 2013-10-18T00:03:53.987 に答える