2

現在、Python インタープリターをアプリケーションに埋め込もうとしています。私のアプリケーションはロギングに Poco API を使用しているため、Python のロギング モジュールからもアクセスできるようにしたいと考えています。これを行う最も簡単な方法は、拡張モジュールとして関数の静的セットを提供してメッセージをログに記録し、これらの関数を呼び出す Handler サブクラスを作成することです。

Py_InitModule()ユーザーに追加の python モジュールをインストールしてほしくないので、組み込みの python インタープリターの外部で自分のコードを再利用する必要がないので、静的関数を提供してからハードコードされた Handler を追加できれば素晴らしいでしょう。作成されたモジュールのサブクラス (ハードコーディングされた手段: 実行時に追加されますが、実際には初期化時に常に解釈される const 文字列)。

私の問題は、通常の python クラス定義を解釈する方法がわからないことです。

class Test:
    someVar=1

特定のモジュールに追加され、次のようにアクセスできるようにしますmymodule.Test

ソリューションは、純粋な python ベースにすることも、python c-api を使用することもできます。

4

2 に答える 2

1

私はついに答えを自分で見つけました:モジュールのコンテキストでコードを実行する方法は実際には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);
于 2012-04-25T13:14:52.820 に答える
0

モジュールに何かを入れるには、それを割り当てるだけです。クラス Test が上記のように定義されていると仮定すると、その名前でモジュール mymodule にアタッチするには、次のように記述します。

mymodule.Test = Test

それでおしまい。

于 2012-04-25T02:35:47.637 に答える