2011-07-25 15 views
0

私は私のC++コードからインポートするPythonモジュールを持っています(私はPythonを組み込みます)。このモジュールには、create()というC++コードを保持する(つまり、boost::python::objectインスタンスに格納する)関数が含まれています。埋め込みPython:インポートされたモジュールからfunc objを取得する

これは私が試みたものです。ランタイムエラーは、私のC++コードで示された行に発生します。このエラーは、メイン名前空間内で "hero.create"関数を見つけることができないために発生します。

C++コード

namespace python = boost::python; 

// Standard Boost.Python code 
// Here I just create objects for the main module and its namespace 

python::object main_module(
    python::handle<>(python::borrowed(PyImport_AddModule("__main__"))) 
); 

python::object main_namespace(main_module.attr("__dict__")); 


// This is my code 
// 

python::exec("import hero", main_namespace, main_namespace); 
python::object func(main_namespace["hero.create"]); // Run-time error 
Entity ent = python::extract<Entity>(func()); 

// I also tried doing this, but it didn't work either... 
// python::object func(main_namespace["hero"].attr("__dict__")["create"]); 

// However, if I do this, all works fine... 
// python::exec("from hero import create", main_namespace, main_namespace); 
// python::object func(main_namespace["create"]); // No error 

Pythonコード(hero.py

from entity import Entity 

def create(): 
    ent = Entity() 
    # ... 
    return ent 
+0

「hero .__ dict__」を印刷するとどうなりますか? 'main_namespace [" hero "]。attr(" create ")'だけを試しましたか?私は 'class.member'を使ってCからアクセスできないと思います。 – agf

答えて

3

あなたはmain_namespace["hero"].attr("create")を行う必要があります。インポートは名前空間に1つの名前しか作成せず、モジュールオブジェクトです。名前にドットを入れることはできません。.はgetattr演算子です。したがって、hero.creategetattr(hero, 'create')と同じです。

execインポートステートメントの代わりにboost::python::importを直接使用することもできます。

+0

答えと、python :: importに関するヒントをありがとう。今はもっときれいに見えます。 :) –

+0

私はフォローアップの質問([6816373](http://stackoverflow.com/questions/6816373))を開いた。もしあなたが喜んでいるなら、それを見てみてください。 –

関連する問題