問題タブ [python-bindings]
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++ - C++ static boost::shared_ptr で Python が生成した値を保持する
Boost.Python と C++ で遊んでいるときに、クラス自体とboost::shared_ptr<>
バージョンを使用してバインドされたクラスを作成することがあります。これは多くの理由で非常に便利で、多くの場所で使用できます。ただし、 Python で生成され、C++ 静的変数に記録された値にboost::python
a を返す場合、このメカニズムは確実に機能しないようです。boost::shared_ptr<>
通常、boost::shared_ptr<>
returned には、これを処理する特別なデリータが保持されると予想されますが、そうではないようです。何が起こるように見えるのは、返さboost::shared_ptr
れたものは、Python で生成された値へのポインタをラップするだけであり、削除に関する特別な考慮事項はありません。これにより、二重削除 (Python インタープリター自体からの削除と C++ 静的からの削除) による一貫したクラッシュが発生するか、少なくともそのように見えます。
以下のコードを使用してこの動作を再現するには、test.cc
以下のようなファイルを作成し、次のスクリプトでテストします。
次の Python テスト プログラムを使用します。
Linux (ubuntu 12.10、Python 2.7 および Boost 1.50) でg++ -I/usr/include/python2.7 -shared -fpic test.cc -lboost_python -lpython2.7 -o test.so
上記のプログラム ( ) をコンパイル ( ) して実行すると、次のスタック トレースが生成されます。python test.py
これは、静的デストラクタで二重削除が発生したことを示します。この動作は、異なるプラットフォーム間で一貫しているようです。
質問: から返された値をコピーせずに、説明されている動作を実現することは可能boost::python
ですか? 上記のおもちゃの例では、それは簡単ですが、私の実際の問題では、のディープコピーはA
実用的ではありません。
python - Cython を使用して Python 変換との間で書き込みを行うことは可能ですか?
boost.python で可能なように、Cython を使用して to-python および from-python コンバーターを作成することは可能ですか?
編集(コメントリクエストに応じて、これが必要な理由の詳細を添えて):
現在、boost.python を介して Python にバインドされている C++ で記述されたコードがあります。この C++ コードでは、Blitz::Array<>'
sを扱います。現在の抽象化スキームでは、Python のコードは NumPy のndarrays
を使用し、C++ のコードは を使用しますBlitz::Arrays<>
。からへ、またはその逆に、非常に透過的な方法で変換できるブリッジを作成しました。このブリッジは、状況によってはコピーを回避することもできます。これはおまけです。numpy.ndarray
Blitz::Array<>
このアプローチの問題:
移植性: Python の異なるバージョン用にコンパイルするには、Python の各バージョン用に Boost.Python をコンパイルする必要があります。
文書化可能性: C++ コードに Python docstring を含めることはあまり良くありません。開発者が見栄えの良いドキュメントを実装することを思いとどまらせました。多くの場合、パッチが適用されていて不完全に見えます。
ビルド速度: boost.python テンプレートのコンパイルは非常に遅くなる可能性があります。CMake を使用してこれを並行して実行して速度を上げますが、その後、プロジェクトでストック Python の卵を作成したいと考えています。おそらくご存知のように、setuptools/distutils と CMake はうまく混ざりません。そのため、このドメインで何かを行うには、ある種の不完全な方法があります。
したがって、Cython の可能性を考えると、Cython を試して、これらすべての問題を解決するハックの少ない方法を見つけようと思いました。依存するコード ベースが既にあり、numpy.ndarray
C++ コード ベースの最小限の記述と最大限の再利用により、可能な限りそれを活用したいと考えています。したがって、私の質問です。
python - PyArg_ParseTuple を使用したユーザー定義型の解析
を使用してユーザー定義型 (または既存の非標準ライブラリの型) を解析する方法はPyArg_ParseTuple
?
python - chromedriver セッションでプロファイル拡張機能をロードすることは可能ですか?
ブラウザプラグインの動作をチェックするプログラムを開発しています[pythonとseleniumで]。プラグインは、ブラウザにインストールしただけのブラックボックスです。
たとえば、Firefox では、それを自分のプロファイルにインストールし、webdriver に必要なプロファイルで Firefox を開くように強制します。私は同じ魔女クロムを作成しましたが、明らかにプロファイルをロードしますが、拡張機能はロードしません。
この機能を機能させる方法はありますか? それとも、拡張機能がブラウザのプロファイルではなく、ログインしたユーザーにバインドされているという問題ですか?
私がする必要があるのは、指定された URL で chrome を実行し、プラグインにサイトを分析させてから、プラグインの出力を確認することです。
別の問題は、私はプログラムを使用する人ではないため、ユーザーに強制的に crx 拡張機能をパックすることを開始したくないということです (または、これを行う簡単な方法はありますか?)。私の要件は、構成ファイルに 1 つまたは 2 つの項目があることです。
chrome-profile: パス/to/プロファイル
アドバイスありがとうございます。
c++ - Boost.Python には、他のブースト ライブラリのコードをバインドする必要がありますか?
boost::statechart ライブラリから継承するクラスがあります。このクラスを Python スクリプトで使用する必要があります。クラスが継承したという理由だけで、すべての boost::statechart ライブラリのラッパー コード (.def s) を記述する必要があるかどうか疑問に思っています。または、boost.python は、定義を確認するためにラッパー コードを必要としません (Python で呼び出すために他のブースト ライブラリを自動的に処理します)。
python - Python + OpenGL – OpenGL への顔の受け渡しを高速化
Python バインディングで OpenGL を使用しています。次のコードを使用して、自分の顔を OpenGL に渡しています。
はtriangles
顔のリストです。
コードのこの部分はかなり遅いようで、約 10,000 個の面のメッシュに数秒かかります。これを for ループを使用する代わりに、すべての三角形を一度に通過させるなど、簡単に高速化する方法はありますか?
python - Pythonバインディングでのセグメンテーション違反の理由は何ですか?
cython を使用して ac ライブラリに python バインディングを記述したいと考えています。ライブラリはマルチスレッドの http サーバーを表し、ヘッダー ファイルを介してその API を公開します。cython ガイドに従って、3 つの基本関数の定義を含む pxd ファイルと pyc ファイルを作成しました。
Python ラッパーは次のようになります。
バインディングは正常に機能し、サーバーが起動してコンテンツを提供しますが、Python からサーバーを停止すると、ほとんどの場合、Python インタープリターがセグメンテーション エラーでクラッシュします。c server_stop から戻った後にクラッシュが発生し、セグメンテーション違反の原因がわかりません。
メモリの割り当て/初期化/解放は、これら 3 つの関数で行われ、c ライブラリによって内部的に完全に処理されます。
多分私は何かが欠けているので、セグメンテーション違反エラーの理由は何ですか?
編集:
valgrind や gdb では再現しません。ただし、コア ダンプを生成すると、バックトレースは次のようになります。
python - PyInstaller バイナリ実行時のエラー「致命的な Python エラー: PyThreadState_Get: 現在のスレッドがありません」
私はPythonを初めて使用し、pyinstallerについて質問があります
私が持っているもの:
- C++ で記述された動的ライブラリをインポートする Python スクリプト (boost python を使用)
Pythonを使用してこのスクリプトを実行すると、すべて正常に動作します
/li>pyinstaller を使用してバイナリを作成し、それを実行しようとすると、次のようになりました
/li>クラッシュのバックトレースは次のとおりです
/li>
問題は、動的ライブラリが python の 1 つのバージョンにリンクされ、pyinstaller が python の別のバージョンにリンクされている可能性があることを読みました (ここで言及されていますMac os x 10.8 の Homebrew + Python: Fatal Python error: PyThreadState_Get: no current thread importing mapnik)しかし、私は次のことを確認しました
およびpyinstallerログ
したがって、pyinstaller と動的ライブラリ python のバージョンは同じであるという結論に達しました。
では、何が問題の原因になるのでしょうか。
後で追加: クラッシュ レポートを詳しく調べたところ、まだ 2 つの python がバイナリにあることに気付きました
しかし、2 つ目は一時ディレクトリ /var/folders にあり、バイナリは /System/Library/Frameworks/Python.framework/Versions/2.7/Python に等しい
python - Python: 再帰関数の変数バインディング
次のような関数を使用して、Python で奇妙なことに遭遇しました。
たとえば、「1」、「2」、「3」、「4」と入力すると、次のように出力されます。
関数が正しい答えを正しく識別しているように見えるため、これは紛らわしいですが、そうすると、最新の応答ではなく、2 番目の応答である値が返されます。
この再帰関数の「x」のバインディングで何が起こっているのか、誰か説明できますか?