問題タブ [boost-python]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - クラス コンストラクター引数としての Boost.Python 関数ポインター
float(*myfunction)(vector<float>*)
コンストラクター ( )に関数ポインターを必要とする C++ クラスがあります
。すでにいくつかの関数ポインターを Python に公開しています。
このクラスを使用する理想的な方法は、次のようなものです。
したがって、このクラスについて次のように Boost に伝えます。
しかし、私は得る:
コンパイルしようとすると。
それで、関数ポインタから得られる柔軟性を失うことなくエラーを修正する方法について誰かアイデアがありますか (つまり、どの関数を呼び出すかを示す文字列にフォールバックしません)。
また、このコードを C++ で記述する主なポイントは速度です。したがって、その利点を引き続き維持できればいいのですが (関数ポインターは初期化中にメンバー変数に割り当てられ、後で 100 万回以上呼び出されます)。
c++ - Python呼び出し可能オブジェクトをC++クラスに登録する
私は、C++クラスに登録されている「呼び出し可能オブジェクト」を渡すことができるはずのPythonでプログラムを書いています。これまでのところ、次のコードを記述しました。
C ++:
Python / C API:
コードはコンパイルされますが、Pythonからメソッドを呼び出し、呼び出し可能オブジェクト(私の場合は別のインスタンスメソッド)を渡すと、次のランタイムエラーが発生します。
boost :: functionが必要になるたびに、彼が呼び出し可能オブジェクトを安全に渡すことができることをブーストに伝える方法が必要だと思います。手作りのソリューションを使用すれば、すべてが機能します。
私はこのようなレジスター関数をいくつか持っているだけなので、手作りのソリューション(役立つマクロを使用)に固執することができますが、変換を自動的に行うためにboost::pythonをどのように指示できるのでしょうか。ドキュメントを見ると、to_python_converterディレクティブが見つかりました。これは、皮肉なことに、必要なものとは正反対です...
c++ - Boost.Python はどのように機能しますか?
インタープリターが C であり、C コンパイラーでビルドされている場合、Python はどのようにして C++ オブジェクトを呼び出すことができますか?
c++ - Boost.Python メソッドは、切り捨てられた予期しない整数値の文字列を返しました
Boost.Python を使用して JRA のBWRepLibを公開していますそのため、Python で sc:bw リプレイでデータ マイニングを実行しようとすると、C++ メソッドから値が返されるという小さな問題に遭遇しました。チュートリアルなどの古い単純なプログラムを実行すると、予期される値が python に返されます (正常に出力される "hello, world" 文字列)。しかし、bwreplib プログラムを実行すると、すべての文字列が切り捨てられ、特定の整数を返すメソッドが予期しない値を返すという問題が発生します。たとえば、あるリプレイでは、C++ のプレーヤー名は、プレーヤー 1 が SlayerS_'BoxeR'、プレーヤー 2 が iloveoov として適切に返されます。ただし、Python で出力される値は erS_'Boxer' と eoov であり、最初の 4 バイト/文字が欠落しています。もう 1 つの例は、整数値 1、2、3、または 6 である必要があるプレーヤーのレースですが、97 などの無関係な値が大きくなっています。120、111、および 78 ですが、120 や 97 などの特定の値は同じレースであり、純粋な C++ プログラムから同じ値を返す必要があります。数値間にバイナリ相関が見られないので、おそらくこれはPythonの単語によって相殺され、別の場所から値を返すのではないかと思いますか? 誰かが同様の問題に遭遇しましたか?
私は Boost.Python を使用するのが初めてで、C++ の専門家ではありません。ラッパーを投稿することはできますが、次のような関数を公開する以外には何もしません。
私が行っていない機能をラップするために何か特別なことをすることになっているのではないかと思います。ただし、オンラインで検索してドキュメントを読んでも、それが何であるかはわかりませんが、見つけたら明らかに明白になると確信しています。
編集:ログ出力
python - boost :: python:Pythonリストからstd :: vector
最後に、[]演算子を使用してPythonでstd::vectorを使用できるようになりました。秘訣は、内部ベクトルのものを処理するBoostC++ラッパーにコンテナーを単純に提供することです。
もう1つの課題は、Pythonリストをstd ::vectorに変換する方法です。std ::vectorをパラメーターとして期待するc++クラスを追加しようとし、対応するラッパーコードを追加しました。
しかし、そうすると、次のBoost.Python.ArgumentErrorが発生します。
C ++関数内でPythonリストにアクセスする方法を教えてもらえますか?
ありがとう、ダニエル
python - Mac で Python ライブラリをビルドし、フラットな名前空間エラーが発生する
原則として、Mac で Python ライブラリをビルドしなければならないときはいつでも、その日を後悔しています。私は通常、Boost::Python を使用してかなりの成功を収めています。また、distutils を使用すると、ほとんどの場合、すべてが正しく機能します。
ただし、機能するものと機能しないものの正確な組み合わせを理解することはできませんでした。具体的には、使用しようとしているライブラリにフラットな名前空間がないために、シンボルが見つからないという恐ろしい問題に遭遇することがよくあります。Python の MacPorts バージョンに切り替えてから、MacPorts ライブラリのみを使用し、サイコロは使用しませんでした。
私が遭遇した最新の問題は、OpenCV ライブラリに依存するツールを使用する必要があることです。このツールは、さらに FFMpeg ライブラリに依存しています (実際には両方ともそうです)。すべてがコンパイルされますが、'import MYLIB' を実行すると、シンボル _pix_fmt_info がフラットな名前空間に見つかりません。DYLIB_LIBRARY_PRINT を実行して、ロードされたすべてのライブラリを表示し、十分な libavformat、libavcodec、libavutil、および libswscale がすべてロードされていることを確認します。
それで、ここに私の質問があります。具体的な質問は、ここで何が起こっているのか知っている人はいますか? libffmpeg を手動でビルドする必要がありますか? 私はライブラリを忘れるなど、本当にばかげたことをしていますか (確認しましたが、そうではないと思います..)
より一般的には、フラットな名前空間の問題に対処するための良いアプローチはありますか? どのライブラリが含まれているか常に心配する必要がありますか? 物事を機能させるための良いレシピを持っている人はいますか?
ときどき Linux の世界が恋しくなることがあります。
編集
申し訳ありませんが、ここでの過失は私の愚かさのようです。正確な問題はわかりませんが、見つからないシンボルは私とは異なるライブラリに属しているようです (つまり、libffmpeg ではありません)。
ただし、フラットな名前空間に関する他の人々の経験にはまだ興味があります。
python - boost::python::extract を防ぐ方法int の受け入れから
boost::python::extract<> を使用して、boost::python::list の項目を float に変換しています。私の問題は python の int にあります - extract<float>
int->float を有効な変換と見なしているようですが、真の float オブジェクトのみが必要です。extract<> をより保守的にする方法はありますか?
makefile - bjam の代わりに make で boost.python を使用する
すべてのbjamマジックを使用せずに、boost.pythonの「hello world」の例をコンパイルしようとしています。私のboost.pythonインストールは機能しています.bjamでサンプルをうまくビルドし、テストスイートに合格しました.
今私のプロジェクトでは、プレーンな Make 環境でこれらすべてのものを使用する必要があります。別のビルド ツールに移植したくありません。
したがって、私の素朴なアプローチは、もちろん、インクルード パスを正しいヘッダーに向け、正しいライブラリにリンクすることです。私はブースト python を system-layout、static、runtime-static としてビルドしました。つまり、/usr/local/lib にある libboost_python.a にすぎません。
残念ながら、結果の .so ライブラリに未解決の外部シンボルが含まれています。
これは、libs/python/example/tutorial/hello.cpp から例をビルドしようとする私の試みです:
では、bjam が libboost_python.a をリンクすると、未定義のシンボルが取得されないという bjam の大きな魔法は何ですか?
python - boost::python:ポインタを期待する関数を呼び出す方法は?
int ポインターを取り、boost::python を介して公開する関数があります。この関数を Python から呼び出すにはどうすればよいですか?
boost::python を使用した C++ の場合:
パイソンで:
結果は
では、ポインタを渡す方法は?
c++ - Boost.Python を使用した Python から C++ への関数変換
C++ で記述され、Boost.Python の助けを借りて Python に公開されたクラスと API がたくさんあります。
私は現在、次のアーキテクチャを作成する可能性を調査しています。
パイソンでは:
C++ の場合:
基本的に、すべての関数をプログラムのネイティブ部分に配置しようとしています。問題は、Boost メタ情報から必要なすべてのデータを抽出して一般的な方法でこれを行うことができるかどうかわからないということです。コンパイル時に、呼び出す関数とそれらが受け入れる引数を知る必要はありません。
いくつかの質問:
1. このようなものを確認するためにアクセスできる共有 Python 情報テーブルはありますか?
2. Boost.Python は型引数のチェックを行います。別々に再利用できますか?
あなたの考えを聞かせてください。
ありがとう