2012-04-23 17 views
2

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

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

私の問題私は、例えば、通常のPythonのクラス定義を解釈する方法を知らないということである:例えば、としてaccesableそれが与えられたモジュールに追加されるように

class Test: 
    someVar=1 

mymodule.Test

Aソリューションは、純粋なPythonベースのものでも、Pythonのc-APIでのものでもかまいません。

+0

2は、あなたがクラスを作成またはモジュールに追加する手助けが必要ですか? –

+0

@ IgnacioVazquez-Abramsこれをモジュールに追加する – Paranaix

答えて

1

私は最終的に自分自身をanswereが見つかりました: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); 
0

何かをモジュールに入れるには、それを割り当てます。クラスTestと仮定すると、その名前の下のmymoduleをモジュールに取り付けてそれをだ

mymodule.Test = Test 

を書くために、上記のように定義されます。

+0

これは、目的のモジュールがインポートされたときに機能しますが、 'Py_InitModule()'を呼び出しただけでは機能しません。 – Paranaix

関連する問題