問題タブ [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.
python - Monkey による Python での C 拡張へのパッチ適用
質問 972で説明した方法を使用して、psycopg で cursor() メソッドをモンキー パッチできませんでした。
psycopg2 のメソッドに型をパッチしようとしましたが、うまくいきませんでした:
C拡張だからですか?
python - 出力ファイルを Python 拡張機能に追加する
build_ext
ピップフレンドリーにしようとしているファンキーな拡張機能を構築するためのカスタムを定義しました。以下は、私がやっていることのトリミングされたバージョンです。
このモジュールをパッケージ化して pip でインストールするとfoo
、virtualenv の site-packages ディレクトリにモジュールができました。ディレクトリ構造は次のようになります。
このegg-info/SOURCES.txt
ファイルには、手動で作成/移動したファイルが含まれていません。コマンド__init__.py
を実行すると、virtualenv のサイト パッケージに残ります。pip でパッケージ全体を削除したいと思います。ビルド ディレクトリに手動で移動した生成ファイルを、インストールされている出力ファイルのリストに追加するにはどうすればよいですか?pip uninstall foo
foo/__init__.py
__init__.py
これは嫌でハッキーだと思うので、嫌でハッキーな答えを歓迎します!
試み:
- 追加
packages=['foo']
-- 私がそうすると、pip は拡張機能をビルドしません。また、パッケージ名のファイル パス/名前空間のバージョンを調整しようとしましたが、違いはありません。
python - ctypesを使用して、Cに埋め込まれたPythonからC関数をコールバックできますか?
Pythonコードが埋め込まれたCプログラムがあります。ソースからpython2.7.2をコンパイルし、libpython2.7.aに対してプログラムをリンクしました。
今度はPythonコードで、Cプログラムにリンクされている他のCライブラリから関数をコールバックしたいと思います。Python拡張機能を作成できます(このドキュメントの「EmbeddedPythonの拡張」を参照)。ただし、ctypesを使用すると、これがはるかに簡単になり、既存のコードを変更せずに使用できるようになります。
ctypesは共有ライブラリのロードを対象としており、静的プログラムコードに「ポイント」する方法があるかどうか疑問に思っていました。
ターゲットがiOSであり、AFAIK共有ライブラリがAppleによって禁止されているため、関連するコードを共有ライブラリにコンパイルできません。
python - PyFrameObjectをPyObjectに変換する方法
何かが足りないかもしれませんが、ここに問題があります。
C拡張機能でPythonコードをトレースしていて、トレース関数がPyFrameObject*フレームを取得しました。ここで、Pythonコード(CythonによってCに埋め込まれるか変換される)でフレームを処理したいのですが、PyObject*を処理します。
PyFrameObject*をPyObject*に変換するにはどうすればよいですか?frameobject.hに適切な変換機能が見つかりません。
ありがとう。
python-c-extension - Python C拡張機能にsocketmodule.hを含めることは可能ですか?
Python C 拡張の socketmodule.h で定義された PySocketModule_ImportModuleAndAPI 関数を呼び出したいと思います。
python - 存在する python 拡張モジュールを読み込めません
実行時に拡張モジュールを作成する thanos を使用しようとしています。Thanos は、実行時に作成した拡張機能をインポートできないため、常に失敗しています。
どうしてこうなったのか不思議です。
実行時(コンパイル後)、「cutils_ext」ディレクトリには次が含まれますcutils_ext.so
import cutils_ext
動作しますが、import cutils_ext.cutils_ext
失敗します
私は直接 with imp でテストしました。cutils がインポートされた cutils_ext パッケージであるとします。私がする時:
私は再び得る:
私は完全に困惑しています。これをデバッグする方法はありますか? (picloudを使用して)Pythonインタープリターを起動できないため、詳細モードでPythonを実行できませんが、実行時に詳細を有効にできれば役立ちます(その方法がわかりませんでした)。
python - CとPythonの統合:ValueError:モジュール関数はMETH_CLASSまたはMETH_STATICを設定できません
私はCとPython2.7.3の統合に最初の冒険をしています。手始めに、基本的な加算を実行できるPython用のCモジュールを作成しようとしています。(これを理解したら、numpyのfindメソッドを作成したいのでnpfindと呼ばれます)
npfind.h:
npfind.c:
pynpfind.c:
npfind.py:
npfindsetup.py
結局のところ、Windows7では次のように入力します
これはうまくいくようです。次にnpfind.pyを見つけようとすると、次のエラーが発生します。
それが何を話しているのか理解できません。METH_CLASSとMETH_STATICとは何ですか、なぜそれらを設定しようとしているのですか?
python - C拡張コードからPythonリストを解放する
Pythonリストを作成し、それにデータ項目を追加するコードがいくつかあります。私たちの懸念は、データ項目の1つがNULLであることが判明した場合、リスト全体(つまり、以前に追加された項目)は無価値であると見なし、リストとそのメモリを解放したいということです。ガベージコレクターがすべてのメモリを解放するようにするには、何をする必要がありますか?
現在のコードは次のとおりです。
しかし、私たちはこのようなことをしたいと思います:
では、リストオブジェクトのDECREFは、GCがすべてを解放するのに十分ですか?
c++ - Python 拡張機能から C++ 仮想メンバーを呼び出すとクラッシュする
Python から呼び出すために、いくつかの C++ クラスの周りに薄いラッパーを作成しようとしています。具体的な問題は、virtual
以下のコメントが外されている場合、インタープリターを作成しようとするとFoo()
クラッシュすることです。この問題を解決するために、このコードを Boost::python、SWIG、または Pyxxx として書き直すことに興味はありません。これは、より大きなシステムからの抜粋です。これらのライブラリのいずれかがこの問題を解決する場合でも、なぜそうなるのか知りたいです。彼らがそれをどのように実装しているか知りたいです。extern "C"
拡張モジュールをセットアップしてシステムに型を登録すると、Python インタープリターからの呼び出しは、Python 型のスロットに登録するクラスの静的メンバーを使用するか、または単に持つだけで、問題なく機能します。
メンバーを仮想として宣言すると、それを (Python インタープリターからの呼び出し内で) 呼び出そうとすると、不正なメモリ アクセスでクラッシュが発生します。アクセスされるアドレスは、クラス メンバーをポインターとして出力した場合に得られるオフセットです。従うべき特定のコードがありますが、基本的な質問は次のとおりです。Python によって呼び出される C ランタイム環境の何かが、仮想クラス メンバー関数のディスパッチを台無しにしますか? Python は v2.6.7 で、C++ 拡張機能は GCC 4.2.1 でコンパイルされています。Boost::python がこれをサポートしていることを示唆する関連する質問があります。彼らはそれを直接行っていますか、それともクラス メンバー関数を介してシミュレートしていますか?
python - Python C 拡張で __init__ に docstring を指定する方法
__init__
おそらくばかげた質問です: C 拡張機能を作成するときなど、特別な関数に docstring を指定するにはどうすればよいでしょうか? 通常のメソッドの場合、メソッド テーブルにはドキュメント文字列が用意されています。help(myclass) を試すと、次の自動生成されたドキュメントが表示されます。
しかし、これは私がオーバーライドしたいものです。