問題タブ [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.
c++ - Mac OS X 上の Boost.Python:「TypeError: 属性名は文字列でなければなりません」
私は最近、MacPorts を使用して Boost をインストールしました。これは、C++ に Python を埋め込むことを目的としています。次に、Python の Web サイトにある例を使用して、Xcode を正しく構成したかどうかを確認することにしました。
正しくコンパイルされますが、起動すると attr() の呼び出しで例外がスローされ、結果のエラー メッセージは"TypeError: attribute name must be string, not 'str'" になります。疑わしいことに、プレースホルダーのように聞こえます。
Googleで調べましたが、運がありません。
Leopard で Boost v1.39、Python 2.5、および GCC 4.0 を使用しています。
c++ - 特定の C++ インスタンスに対して常に同じ Python インスタンスが返されるようにするにはどうすればよいですか?
Boost.Python を使用して C++ ライブラリをラップしています。
同じ Python インスタンス (オブジェクト ID による) が特定の C++ インスタンス (ポインター ID による) に対して常に返されるようにするにはどうすればよいですか? C++ クラスを拡張することはできませんが、役立つ場合はメンバー変数 (PyObject * や boost::python::handle<> など) を追加できます。Python インスタンスを C++ インスタンスにキャッシュし、新しいインスタンスを作成する代わりにキャッシュされたインスタンスを返すことができるはずだと考えています。ただし、必要なラッピング コードがわかりません。
ラップされるクラスの例:
誰でもアドバイスを提供できますか?
c++ - Boost::Python と Boost::Threads に関する問題
私と友人は、Boost::Python を使用するアプリケーションを開発しています。Boost::Python を介して C++ でインターフェイスを定義し、Boost::Python から継承してクラスを作成する必要があるユーザーに公開しました。このクラスは、アプリケーションが取得してコールバック メカニズムに使用します。
これまでのところ、すべてがうまくいっています。ここで、関数のコールバックには時間がかかる場合があります (ユーザーが重いものをプログラムした可能性があります)...しかし、ウィンドウを再描画する必要があるため、「動かなくなった」ようには見えません。 . 一度に実行されるコールバックは 1 つだけです (他のスレッドが同時に python を呼び出すことはありません)。 Python 用にラップされた C++ コード。
私たちがしていることは、Py_Initialize() の直後に PyEval_InitThreads() を呼び出すことです。それから、独自のブースト スレッド内でコールバック関数を呼び出す前に、マクロ PY_BEGIN_ALLOW_THREADS を使用し、スレッドが終了したときにマクロ PY_END_ALLOW_THREADS を使用します。
実行が 2 番目のマクロに到達しないと言う必要はないと思います。実行するたびにいくつかのエラーが表示されます...しかし、実際のコールバックを呼び出している間は常にエラーが発生します。私はよくグーグルで検索し、スレッドに関するいくつかのPEPドキュメントを読みましたが、それらはすべて、Pythonモジュール内のスレッド化(純粋な仮想クラスが公開されているだけだとは思いません)またはPython内のスレッド化について話し、メインについてではありません複数のスレッドから Python を呼び出すアプリケーション。
助けてください、これは私を数時間イライラさせてきました。
Ps。ヘルプ!
python - Boost.Python によって公開された列挙型のピクル
Boost.Python で公開された列挙型を (cPickle を使用して) ピクルすることは可能ですか? hereで説明されている最初の方法を使用して他のオブジェクトを正常にピクルしましたが、列挙型には適用されないようであり、オブジェクトはデフォルトでピクル可能ではないようです。
boost-python - ブースト python は、参照または値によってベクトルを返す関数をサポートしていますか?
私はpythonを初めて使用します。boost pythonを見てきましたが、非常に印象的です。ただし、導入を進めると、オブジェクトのベクトルが python リスト/タプルとして返される例が見つかりません。
つまり、この例を見てみましょう。クラス X、Cont、およびそのすべての関数を公開したいと考えています。重要なビットは、X または文字列のベクトルを Python に返します
const_ref_x_vec()、value_x_vec() などの関数を公開しようとする私自身の実りのない試みは、コンパイル エラーにつながります。
グーグルで調べたところ、値または参照でベクトルを返すことをサポートする例は見たことがありません。これはboost pythonでも可能ですか?回避策はありますか?この場合、SWIG を使用する必要がありますか?
どんな助けでも感謝します。
アバター
c++ - boost::pythonを使用してC++クラスインスタンスをPythonに渡す
オブジェクト(クラスAのインスタンス)を作成し、それらのメソッドを呼び出すことができるPythonプログラムにそれらを渡すライブラリがあります。
基本的に私はC++クラスのインスタンスを持っており、Pythonからそれらを使用したいと思います。場合によっては、そのオブジェクトを操作のためにC++に戻す必要があります。
New
次のラッパーファイルを作成しました(関数がC ++コードのどこかで呼び出されていると仮定します)。
このコードには、Pythonが。を取得する部分がありませんexisting_instance
。私はそれを貼り付けませんでしたが、その目的のためにコールバックメカニズムを使用するとしましょう。
このコードは機能しますが、いくつか質問があります。
Count関数(および他のすべてのC ++操作関数)では、
a
そのように渡すのは問題ありませんか、それとも次のようなことを行う方が良いconst shared_ptr<A>&
ですか?Python Boostのドキュメントで見つけたコードスニペットでは、参照がよく使用されますが、違いがわかりません(もちろん、より高い参照カウンターがあることを除けば)。このコードは「安全」ですか?既存のインスタンスをpythonに渡すと、そのカウンターがインクリメントされます(Pythonでオブジェクトのコピーをさらに作成する場合でも、もちろん1回だけです)。そのため、Pythonが保持している限り、C++コードがオブジェクトを破棄することはできません。少なくとも「コピー」。私は正しいですか?ポインタで遊んでみましたが、正解のようです。念のためお願いします。
PythonがAのインスタンスを作成しないようにしたいのですが、C++コードからのみ渡す必要があります。どうすればそれを達成できますか?編集:見つかりました、私はno_initとコピー不可を使用する必要があります:
class_<A, boost::noncopyable>("A", no_init)
python - Cython で C ラッパーを作成する - Python
次の C 関数をラップする方法を理解しようとしています = compress.c、compress.h。
チュートリアルに従ってみましたが、.pxdファイルを作成した後、何をすればよいかわかりません:|
私が理解したことから、これは私が持つべきpxdファイルです
この後、私は何をすべきかわかりません:|
助けてください!=)
編集:
このエラーの取得
とにかくありがとう=)
c++ - Boost autolinks libraries which are not built by Boost, but the intended ones are built
I am developing a Math application which can be extended by writing python scripts.
I am using Qt 4.6.3 (built as static library, debug and release versions) and Boost 1.43.0 (built as static library, runtime-link also set to static, multi-threaded version, debug and release). Everything is built with MSVC++2008. Boost built the following libraries:
- libboost_python-vc90-mt-s-1_43.lib
- libboost_python-vc90-mt-s.lib
- libboost_python-vc90-mt-sgd-1_43.lib
- libboost_python-vc90-mt-sgd.lib
My project compiles, but gives the following error during the linking phase:
Why is it not selecting one of my compiled libraries?
I think the s in the library names stands for static, but then the auto-linking feature seems to select a dynamic library, and I want it all linked statically in one executable.
The same happens with the regex library: I have the same 4 regex libraries compiled and a quick test shows this linking error:
What to do?
exception - Boost pythonによるモジュール間例外名解決が機能しませんか?
これが私の問題です:
ダイナミックリンクライブラリとして構築された2つのC++モジュールAとBがあります。Aは、基本的な数学関数とカスタム例外タイプを提供します。Bは、Aを使用する上位レベルのモジュールです。
B :: someFunction()はAから関数を呼び出し、カスタム例外A:MyExceptionFromAをキャッチして、カスタムタイプB:MyExceptionFromBに変換しようとします(モジュールBのユーザーはAの実装の詳細を知る必要がないため) )。
私がC++ドメインに留まっている限り、すべてが正常に機能します。ただし、BoostPythonを介してPythonでB:: someFunction()を公開すると、C++モジュールで例外がキャッチされなくなります。
A:MyExceptionFromAの派生元であるstd :: runtime_errorをキャッチし、typeid(e).name()を呼び出して正しいマングル名を取得できるので、正しい例外がスローされることがわかります。したがって、問題は、このマングルされたシンボルを正しい例外タイプに解決することに起因すると思われます。
このリンクを見つけました。これは、「Pythonは[insular]モデルを使用して拡張モジュールを開くため、拡張モジュールの作成者は他の拡張モジュールが使用している可能性のあるシンボルを知る必要がない」と説明しています。これは問題/解決策の一部であると思われますが、問題を解決する方法を理解するためのシンボル解決について十分に理解していません。
何か案は?
python - Python は Boost.Python ライブラリをどのようにロードしますか?
別の C++ ヘッダー ファイルからクラス "D" を取得する、次の典型的な Boost.Python モジュールを検討してください。
これを共有ライブラリにコンパイルすると、Python に公開する方法がわかりません。
- 図書館は何と呼べばいいですか?そう?liba.so? それで?libb.so?
- ライブラリはどこにある必要がありますか? サブディレクトリに残すことはできますか?