2

目標: Boost::Python ライブラリを使用して、C++ コードで Python をインタラクティブに使用しようとしています。私の目標は、Python インタープリターから C++ で定義したクラスの変数を変更することです。

コードは以下に添付されています。

問題: Python インターフェイスでライブラリをロードし (つまり、hello をロード)、そこからオブジェクトを作成できます (obj = hello.World())。変数なしで関数 ( obj.greet() ) にアクセスすることもできますが、変数 (obj.Set("Hello") ) を使用して関数にアクセスしたい場合は、メモリ アクセス違反 ("アクセス違反読み取り位置 0xffffffffffffffff") が発生します。その関数が文字列を取るだけの空の関数であっても。

struct World
{
    void set(string _msg) {}
    string greet() { return msg; }
    string msg;
};
typedef boost::shared_ptr<World> World_ptr;
BOOST_PYTHON_MODULE(hello)
{
    bp::class_<World, World_ptr>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}
int main(int argc, char **argv)
{
    Py_Initialize();    

    bp::object main = bp::object(bp::handle<>(bp::borrowed(PyImport_AddModule("__main__"))));
    bp::object global(main.attr("__dict__"));
    inithello();
    // Bring up Python interpreter
    Py_Main(argc, argv);

    Py_Finalize();

    return 0;
}

実際、これは Boost::Python チュートリアルから来ており、Python インタープリターを使用するように変更されてい ます http://www.boost.org/doc/libs/1_51_0/libs/python/doc/tutorial/doc/html/python/exposing.html

どうもありがとう

---------------------編集----------------------

多くのテストを行った結果、問題は文字列入力のみにあることがわかりました。つまり、char* や int は問題ありません。ブーストpythonの文字列に問題はありますか?

4

2 に答える 2

1

エラーは表示されません

/**
 $ sudo apt-get install libboost-python-dev
 $ ./do
*/
#include <boost/python.hpp>

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};


namespace py = boost::python;

BOOST_PYTHON_MODULE(hello)
{
  py::class_<World>("World")
    .def("greet", &World::greet)
    .def("set", &World::set)
    ;
}

int main(int argc, char* argv[]) {
  Py_Initialize();
  inithello();

  PySys_SetArgv(argc, argv); // use later in Python
  if (PyRun_SimpleString("import hello\n"
                         "planet = hello.World()\n"
                         "planet.set('howdy')\n"
                         "print(planet.greet())\n"

                         // start interactive Python shell if `-i`
                         "import sys\n"
                         "if '-i' in sys.argv:\n"
                         "  import code\n"
                         "  code.interact()\n" //NOTE: namespace may be provided
                         ) < 0)
    return 1; // an exception is raised in Python

  Py_Finalize();
}

プログラム内でPythonコンソールを起動するにはどうすればよいですか(デバッグを簡単にするため)?も参照してください。。

コンパイル:

$ c++ main.cpp -o main `python-config --cflags` \
     `python-config --ldflags` -lboost_python

走る:

$ ./main -i
于 2012-08-23T19:06:34.047 に答える
1

私は間違いを犯したことに気付き、boost_python のスタティック ライブラリ (.lib ファイル) をリンカ ページに追加しました。何につながったのかはわかりませんが、削除した後、「boost_python-vc100-mt-1_51.dll」の代わりにプログラムが「boost_python-vc100-mt-gd-1_51.dll」を使用していることがわかりました。

問題は解決しましたが、何が問題だったのか説明できる人はいますか?

すべての助けに感謝します

于 2012-08-24T22:52:22.810 に答える