問題タブ [python-extensions]
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++ - メモリリークの可能性
誰かがメモリリークがあるかどうかを確認できますか? 私は混乱しています。
python - モジュールからインポートできるようにPythonC拡張機能を構築する方法
distutilsでパッケージ化した多くのサブモジュールを含むPythonプロジェクトがあります。これらのサブモジュールのいくつかに存在するようにCでいくつかのPython拡張機能を構築したいのですが、Python拡張機能をサブモジュールに存在させる方法がわかりません。以下は、私が探しているものの最も簡単な例です。
これが私のPython拡張機能c_extension.c
です:
そして、setup.py
これが機能します:
virtualenvにインストールした後、これを行うことができます。
c_extension
しかし、私はサブモジュールに住みたいと思いますfoo.bar
。Pythonシェルの動作を次のようにするには、このパイプラインで何を変更する必要がありますか。
python - 拡張モジュールの循環ガベージコレクションを修正する
Python 2.7のドキュメントの2つのセクションでは、拡張モジュールで定義されたコンテナオブジェクトのサイクリックガベージコレクション(CGC)サポートの追加について説明しています。
Python / C APIリファレンスマニュアルには、次の2つのルールがあります。
- オブジェクトのメモリは、
PyObject_GC_New()
またはを使用して割り当てる必要がありますPyObject_GC_NewVar()
。- 他のコンテナへの参照を含む可能性のあるすべてのフィールドが初期化されたら、を呼び出す必要があります
PyObject_GC_Track()
。
たとえば、Pythonインタープリターの拡張と埋め込みでは、フラグと塗りつぶしとスロットNoddy
を追加するだけでCGCサポートを有効にできるようです。そして、上記の2つのルールはまったく実践されていません。Py_TPFLAGS_HAVE_GC
tp_traverse
tp_clear
/と/Noddy
のルールに実際に従うように例を変更すると、驚くべきことに、次のようなアサーションエラーが発生しました。PyObject_GC_New()
PyObject_GC_Del()
PyObject_Track()
PyObject_GC_UnTrack()
Modules / gcmodule.c:348:visit_decref:アサーション "gc-> gc.gc_refs!=0"が失敗しました。refcountが小さすぎました
これは、CGCを実装するための正しい/安全な方法についての私の混乱につながります。誰かがアドバイスを与えることができますか、できれば、CGCをサポートするコンテナオブジェクトのきちんとした例を教えてください。
c++ - Boost.Python を介して公開された仮想 C++ クラスの拡張
Boost.Python を使用して、この C++ クラスを公開しようとしています。
私の最終的な目標は、Python シェルで VALgorithm の子を Python クラスとして定義することです。この例に従って、コールバック クラスを定義しました。
現在、クラス自体と GetName() メソッドのみを公開しています。これは仮想クラスであるため、次のコードを BOOST_PYTHON_MODULE 内に配置しました。
これをコンパイルして、Python シェルにモジュールをロードできます。次に、子クラスを定義して、C++ コードで定義されている GetName() の既定の実装を呼び出します。
私は専門家ではありません (これらの問題に初めて直面しただけです) が、ConcAlg1 と ConcAlg3 が VAlgorithm オブジェクトをインスタンス化しようとして、VALgorithm を公開するときに使用される no_init パラメーターが原因で失敗するように思えます (省略できないか、コードはコンパイルされません)、ConcAlg2 は GetName() を呼び出すことができません。これは、どういうわけか VAlgorithm の子として認識されないためです。私は些細なことをしているに違いありませんが、何が原因かわかりません (私は Boost.Python と拡張機能の初心者です)。誰でも私を助けてもらえますか?ありがとう
python - Python でのアスペクト指向プログラミング (AOP)
重複の可能性:
Python 用の AOP サポート ライブラリはありますか?
私はAspectJ
Java 言語の拡張機能に精通しています。
Pythonにそのようなものがあるかどうか知りたいです。
誤解しないでほしいのですが、ライブラリのことではなく、AspectJ
Java のような言語拡張のことです。
python - simplejson のインストール時に「C 拡張機能をコンパイルできませんでした」というメッセージが表示されるのはなぜですか?
ところで、私は Windows を使用しているので、Visual Studio をインストールする必要がありますか?
警告: C 拡張機能をコンパイルできませんでした。高速化は有効になっていません。
python - Python のビルド時に sqlite3 のビルドに失敗したのはなぜですか?
sqlite のビルドに失敗したのはなぜですか?
readline や _tkinter などと関係がありますか?
これらのモジュールをビルドできませんでした:
_sqlite3
詳細:
私のシステムはcentos 5.3です
python - Python + C 拡張機能が埋め込まれたアプリケーションで msvcr90.dll の重複を回避しますか?
Python 2.7 を組み込んだ Windows アプリケーションを配布しています (手法: python27.dll + 'Python27' ディレクトリと DLL および Lib フォルダーを .exe と共にインクルードします)。また、C 拡張機能 (基本的に DLL である .pyd ファイル) を使用するカスタム Python パッケージも含めています。
msvcr90.dll のバージョン 9.0.21022.8 と関連するマニフェストが必要であることは承知しています。msvcr90.dll + マニフェストを .exe ファイルと一緒に置くことができ、問題なく動作しています。しかし、カスタム Python パッケージを使用するには、msvcr90.dll + マニフェストをパッケージの .pyd ファイルと同じレベルに含める必要があることがわかりました (存在しない場合、PyImport_ImportModule 中にアプリケーションがクラッシュします)。.pyds がツリーのさらに上にある msvcr90.dll を「見る」ことができない理由がわかりません。
宛先マシンで MS Visual C 再頒布可能パッケージを実行することで (おそらく) これを回避できることを認識しています...これにより、基本的に MSVCR DLL + マニフェストがインストールされるため、システム全体で使用できるようになります。しかし、ユーザーにそれを実行するように要求したくはありません。また、正しい場所にインストールしてバージョン管理などを自分で処理しようとして台無しにしたくもありません。
python - Python C 拡張: PyFloat_FromDouble(double) segfault を返す
最近、遅い Python コードを C 拡張に変換しました。162 回目の呼び出しで、return ステートメントで segfault を生成することを除いて、これは美しく機能します。
仕組みは次のとおりです。一度、計算したい関数をすべて呼び出す前に、データをメモリにロードします (親オブジェクトを INCREF することを忘れないでください)。
( C-array メソッドについては、http://www.scipy.org/Cookbook/C_Extensions/NumPy_arraysを参照してください)。次に、ロードされた double[][], DOSAGES を、Python から呼び出す関数で参照します。
大量のデバッグ ステートメント (ご覧のとおり) を使用して、segfault を return ステートメントにローカライズしました。つまり、python float オブジェクトのインスタンス化の後ですが、C からの return の呼び出しと、次に実行される python の行 (つまり、print("debugReturned") です) の間のどこかです。
double は奇妙な値ではなく、python オブジェクトは正しく作成されており、NULL ではありませんが、C から戻ってから python に進むまでの間にエラーが発生します。オンラインのソースは、これが INCREF/DECREF の問題である可能性があることを示唆していますが、PyFloat_FromDouble() と Py_BuildValue("f",double) は新しい参照を生成するため、INCREF する必要はないと述べています。どちらを選択しても、同じ結果が生成されます。grm_loadDosage 関数の実行中に行列を保持する PyObject を INCREF する必要があることは十分に確信していますが、その INCREF を使用した場合と使用しない場合の両方を同じ動作で試しました。
何が起こっているのですか?
ありがとう
また、スタックトレース:
python - PyArg_ParseTupleの適切な使用法は何ですか
PyArg_ParseTupleの正確なusgaeと思われるものを使用していますが、コードはまだ機能していません。私はPython2.7を使用しています
これは私が書いているPython拡張機能のCコードです。
次に、拡張機能をビルドしてターミナルimport etに移動すると、et.tpp([1,2])は行の出力に失敗しますif(PyArg_ParseTuple(item、 "i"、&arrayValue)!= 0){printf( " %d \ n "、arrayValue); printf( "horray!\ n"); }
コードでわかるように、リスト内の要素のタイプを確認すると、「int」が出力されます。しかし、何らかの理由でPyArg_ParseTupleにエラーが発生しています。
Pythonのリストから情報にアクセスしてデータをコピーし、それを他の場所のCコードに渡して、結果をPythonに返すことができる必要があります。
どうもありがとう!