Boost.Pythonを使用してC ++オブジェクトを参照/ポインターでPythonインタープリターに渡します

ホロクロンウィーバー

私はC ++オブジェクトを持っており、PythonがC ++とPythonの両方に表示される変更を加えることができるように、参照/ポインターによって埋め込まれたPythonインタープリターに渡したいと考えています。相互運用にBoost.Pythonを使用しています。

例として、クラスFoo、そのBoost.Pythonラッパー、およびFooC ++のオブジェクトを次に示します

mymodule.h

struct Foo
{
    int bar;

    Foo(int num): bar(num) {}
};

mymodule.cpp

#include "mymodule.h"
#include <boost/python.hpp>

BOOST_PYTHON_MODULE(mymodule)
{
    using namespace boost::python;

    class_<Foo>("Foo", init<int>())
        .def_readwrite("bar", &Foo::bar)
    ;
}

main.cpp

#include <iostream>
#include <boost/python.hpp>
#include "mymodule.h"

using namespace boost::python;

int main()
{
    Py_Initialize();

    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");
    import("mymodule");

    Foo foo(42);

    // ... somehow use Boost.Python to send reference to interpreter ... 

    object result = exec_file("myscript.py", main_namespace);

    std::cout << foo.bar << std::endl;                
}

ではfoo、C ++とPythonの両方がその内容を確認できるように、Pythonへの参照を送信するにはどうすればよいですか?

ホロクロンウィーバー

C ++では、スクリプトを実行する前に、次を追加します。

main_namespace["foo"] = ptr(&foo);

これで、Python環境にはC ++変数へのポインターがありfoo、Pythonスクリプトによって変数に加えられた変更は、コピーではなくC ++オブジェクトで実行されます。

の場合myscript.py

foo.bar = 12

その場合、cout最後の出力は、12ではなくになり42ます。

名前空間fooに配置して、mymoduleその起源を自己文書化することをお勧めしますmymodule.foo.bar

Boost.Pythonのドキュメントでは、このパスバイポインターの方法については説明されていないようですが、それでも機能します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

boost :: log :: expressionformatterオブジェクトをストリームに挿入してタイムスタンプをフォーマットする方法

分類Dev

カスタムオブジェクトポインタのboost :: hash_valueをオーバーロードしています

分類Dev

boost-pythonを使用してPythonスクリプトからC ++にパラメーターを渡す

分類Dev

共有メモリを使用して2つのプロセス間でcv :: Matオブジェクトを交換するために、ランタイムサイズパラメータを使用してboost spsc_queueを構築する方法は?

分類Dev

Boost.Pythonを使用して共有ライブラリを構築し、Pythonを介してBlenderにインポートします

分類Dev

有効なクラスオブジェクトポインタをboost :: function <> fnにバインドします。オブジェクトが破棄された後に `fn`を呼び出すとどうなるでしょうか?

分類Dev

CMakeはBoostを検出しますが、インポートされたターゲットはBoostバージョンでは使用できません

分類Dev

CMakeはBoostを検出しますが、インポートされたターゲットはBoostバージョンでは使用できません

分類Dev

std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

分類Dev

Pythonインタープリターはオブジェクトの負の参照カウントをどのように処理しますか?

分類Dev

スコープを変更すると、Boost共有メモリ内のオブジェクトへのポインタが無効になるのはなぜですか?

分類Dev

「BracedInitializerList」スタイルの文字列をC ++でトークン化します(Boostを使用しますか?)

分類Dev

Boost :: Pythonを使用してPythonオブジェクトをC ++にロードしようとすると、「AttributeError: 'module'には属性 'player'がありません」

分類Dev

関数に値で渡すことができるように、バックエンドの構造体オブジェクトへのポインターであるインターフェイスを逆参照しようとしています

分類Dev

C ++でオブジェクトを作成し、Pythonにポインタを渡します

分類Dev

[Boost] :: DIインジェクターから一意のshared_ptrオブジェクトを作成

分類Dev

ngForを介してインターフェイスオブジェクトをカスタムコンポーネントに渡します

分類Dev

Boost.Pythonを使用してポインタを返すC ++関数を公開する

分類Dev

C ++のオブジェクトへのポインタを使用してデータを取得します

分類Dev

Boost MPLを使用して、関数に複数のリターンポイントを設定するにはどうすればよいですか?

分類Dev

エラー:自明にコピーできないタイプのオブジェクトを渡すことはできません 'クラスboost :: filesystem :: path'から '...'

分類Dev

データをインポートしてオブジェクト属性として使用するPythonの方法

分類Dev

Boost.Python を使用したプライベート コンストラクター

分類Dev

Pythonのインタープリターに入力したときにNoneのように動作するオブジェクトを作成できますか?

分類Dev

呼び出し可能オブジェクトを値で渡し、ポインターメンバーに割り当てます

分類Dev

ec2インスタンスの入力パラメーターとしてawss3フォルダーオブジェクトを使用して、コンピューター上にあるpythonスクリプトを実行します

分類Dev

コンポーネントデータオブジェクトをパイプに渡す方法

分類Dev

配列インデックスを介してデータからVue.jsのコンポーネントにオブジェクトを渡します

分類Dev

BoostPythonを介してC ++オブジェクト間で共有ポインターを渡すことによるセグメンテーション違反

Related 関連記事

  1. 1

    boost :: log :: expressionformatterオブジェクトをストリームに挿入してタイムスタンプをフォーマットする方法

  2. 2

    カスタムオブジェクトポインタのboost :: hash_valueをオーバーロードしています

  3. 3

    boost-pythonを使用してPythonスクリプトからC ++にパラメーターを渡す

  4. 4

    共有メモリを使用して2つのプロセス間でcv :: Matオブジェクトを交換するために、ランタイムサイズパラメータを使用してboost spsc_queueを構築する方法は?

  5. 5

    Boost.Pythonを使用して共有ライブラリを構築し、Pythonを介してBlenderにインポートします

  6. 6

    有効なクラスオブジェクトポインタをboost :: function <> fnにバインドします。オブジェクトが破棄された後に `fn`を呼び出すとどうなるでしょうか?

  7. 7

    CMakeはBoostを検出しますが、インポートされたターゲットはBoostバージョンでは使用できません

  8. 8

    CMakeはBoostを検出しますが、インポートされたターゲットはBoostバージョンでは使用できません

  9. 9

    std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

  10. 10

    Pythonインタープリターはオブジェクトの負の参照カウントをどのように処理しますか?

  11. 11

    スコープを変更すると、Boost共有メモリ内のオブジェクトへのポインタが無効になるのはなぜですか?

  12. 12

    「BracedInitializerList」スタイルの文字列をC ++でトークン化します(Boostを使用しますか?)

  13. 13

    Boost :: Pythonを使用してPythonオブジェクトをC ++にロードしようとすると、「AttributeError: 'module'には属性 'player'がありません」

  14. 14

    関数に値で渡すことができるように、バックエンドの構造体オブジェクトへのポインターであるインターフェイスを逆参照しようとしています

  15. 15

    C ++でオブジェクトを作成し、Pythonにポインタを渡します

  16. 16

    [Boost] :: DIインジェクターから一意のshared_ptrオブジェクトを作成

  17. 17

    ngForを介してインターフェイスオブジェクトをカスタムコンポーネントに渡します

  18. 18

    Boost.Pythonを使用してポインタを返すC ++関数を公開する

  19. 19

    C ++のオブジェクトへのポインタを使用してデータを取得します

  20. 20

    Boost MPLを使用して、関数に複数のリターンポイントを設定するにはどうすればよいですか?

  21. 21

    エラー:自明にコピーできないタイプのオブジェクトを渡すことはできません 'クラスboost :: filesystem :: path'から '...'

  22. 22

    データをインポートしてオブジェクト属性として使用するPythonの方法

  23. 23

    Boost.Python を使用したプライベート コンストラクター

  24. 24

    Pythonのインタープリターに入力したときにNoneのように動作するオブジェクトを作成できますか?

  25. 25

    呼び出し可能オブジェクトを値で渡し、ポインターメンバーに割り当てます

  26. 26

    ec2インスタンスの入力パラメーターとしてawss3フォルダーオブジェクトを使用して、コンピューター上にあるpythonスクリプトを実行します

  27. 27

    コンポーネントデータオブジェクトをパイプに渡す方法

  28. 28

    配列インデックスを介してデータからVue.jsのコンポーネントにオブジェクトを渡します

  29. 29

    BoostPythonを介してC ++オブジェクト間で共有ポインターを渡すことによるセグメンテーション違反

ホットタグ

アーカイブ