問題タブ [python-c-api]
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 - PyCxx で継承可能な Python 型を作成する
友人と私は最近、さまざまな Python C++ ラッパーをいじり回しており、いくつかの専門的なプロジェクトと趣味のプロジェクトの両方のニーズを満たすものを見つけようとしています。Python C api の最も醜い部分を隠しながら、軽量であることとインターフェイスが簡単であることのバランスが取れているため、私たちは両方ともPyCxxに磨きをかけてきました。ただし、PyCxx は型の公開に関してはそれほど堅牢ではありません (つまり、コンストラクターを実装するのではなく、型ファクトリを作成するように指示します)。私たちは型をより機能的な方法で公開するためにギャップを埋めることに取り組んできました。 . これらのギャップを埋めるために、C API に目を向けます。
しかし、これにより、いくつかの疑問が残りました。API のドキュメントではあまり詳しく説明されていないようです (また、説明されている場合、答えが矛盾する場合があります)。基本的な包括的な質問は次のとおりです: Python 型が基本型として機能するには、何を定義する必要がありますか? PyCxx クラスが型として機能するためには、tp_new と tp_dealloc を明示的に定義し、型をモジュール属性として設定する必要があることがわかりました。私たちはまだ暗闇の中で手探りしていること。
これまでのコードは次のとおりです。
Python テスト コードは次のようになります。
興味深いことに、meanKitty のすべてのビットをコメントアウトすると、スクリプトが実行され、猫は問題なくニャーと鳴きますが、meanKitty クラスのコメントを外すと、Python は突然次のように表示します。
それは私のがらくたを混乱させます。それを継承すると、基本クラスが完全に隠されているようです。私たちが欠けているものについて誰かが洞察を提供できれば、それはありがたいです! ありがとう!
編集: オーケー、これを投稿してから約 5 秒後に、以前に試してみたかったことを思い出しました。次のコードをキティに追加しました-
そして今、私たちは Python で両方の子猫にニャーと鳴いています! ただし、まだ完全ではありません。
だからまだ助けを探しています!ありがとう!
python - Python c-api と unicode 文字列
Python オブジェクトとさまざまなエンコーディングの C 文字列との間で変換する必要があります。ac 文字列から Unicode オブジェクトへの移行は、PyUnicode_Decode を使用して非常に簡単でしたが、逆の方法はわかりません
Python Unicode 文字列を受け取り、指定されたエンコードを使用してバッファに入れる別の関数を作成したいと思います。
PyUnicode_AsEncodedString と関係があると思われますが、それは PyObject を返すので、それをバッファに入れる方法がわかりません...
注: 上記の両方のメソッドは、Python 3.0 を使用している Python API をラップする C++ Unicode クラスのメンバーです。
c++ - Python C-API オブジェクトの割り当て
オブジェクトの作成と破棄に new および delete 演算子を使用したいと考えています。
問題は、python がいくつかの段階に分かれているように見えることです。tp_new、tp_init、および tp_alloc は作成用であり、tp_del、tp_free、および tp_dealloc は破棄用です。ただし、c++ には、オブジェクトを割り当てて完全に構築する new と、オブジェクトを破棄して割り当てを解除する delete しかありません。
どの python tp_* メソッドを提供する必要があり、何をする必要がありますか?
また、「PyObject *obj = new MyExtensionObject(args);」など、C++ でオブジェクトを直接作成できるようにしたいと考えています。これをサポートするには、何らかの方法で new 演算子をオーバーロードする必要がありますか?
また、Python で拡張機能の型をサブクラス化できるようにしたいと考えています。これをサポートするために何か特別なことをする必要がありますか?
私はpython 3.0.1を使用しています。
編集:わかりました、tp_initは私がやっていることに対してオブジェクトを少し変更しすぎているようです(たとえば、Textureオブジェクトを取得し、作成後に内容を変更することは問題ありませんが、サイズ、bitdeptなどの基本的な側面を変更すると壊れますそのようなものが修正されていることを前提とする多くの既存のC++のもの)。私がそれを実装しない場合、構築された後に __init__ を呼び出す人々を単に停止します(または、少なくともタプルのように呼び出しを無視します)。または、同じオブジェクトで tp_init が複数回呼び出された場合に例外または何かをスローするフラグを用意する必要がありますか?
それとは別に、私は残りのほとんどをソートしたと思います。
python - C API で NumPy マトリックスを作成する方法はありますか?
見つけた NumPy C API のドキュメントを読みましたが、2 次元配列ではなく、C API で行列オブジェクトを作成できる可能性があるかどうかを確認できませんでした。この関数は数学行列での作業を目的としており、ユーザーがこの値を配列から行列に変換するのを忘れて行列乗算を呼び出した場合に奇妙な結果が得られることは望ましくありません (行列サブクラスの唯一の違いは乗算と累乗です)。
python - Python C-API オブジェクトの初期化
Python オブジェクトを既存のメモリに初期化する正しい方法は何ですか (C++ の inplace new のように)
このコードを試してみましたが、_ob_prev と _ob_next が設定されていないため、デバッグ ビルドでアクセス違反が発生します。
object.c の 1519 行目でクラッシュが発生します。
python - Python 3 C API でのファイル I/O
Python 3.0 の C API は、ファイル オブジェクトの多くの関数を変更 (非推奨) しました。
以前は、2.X で使用できました
Python ファイル オブジェクトを作成するには、次のようにします。
...しかし、そのような関数は Python 3.0 には存在しません。そのような呼び出しに相当する Python 3.0 は何でしょうか?
python - Python 拡張機能で返されるオブジェクトのエチケット
Solaris kstat データへのアクセスを提供するための Python 拡張機能を作成しています (出荷されている perl ライブラリ Sun::Solaris::Kstat と同じ精神で)。リストまたは単一のオブジェクトを条件付きで返すことについて質問があります。Python の使用例は次のようになります。
現在実装されているように、lookup() は一致するすべての kstat オブジェクトのリストを返します。最初のケースではオブジェクトのリスト (CPU の数だけ) が返され、2 番目の呼び出しでは単一の kstat が完全に指定され、1 つの kstat を含むリストが返されます。
私の質問は、一致するものが 1 つしかない場合に単一のオブジェクトを返し、多数ある場合にリストを返すのは不適切な形式ですか?
思慮深い答えをありがとう!私のpython-fuは弱いですが、あなたのような人々のおかげでより強くなっています.
python - Python C API:例外の文字列表現を取得するには?
もしそうなら (例)
Python (およびファイルが存在しない) では、トレースバックとメッセージが表示されます
上記の文字列を Python の C API (つまり、C プログラムに埋め込まれた Python インタープリター) で取得したいと考えています。コンソールへの出力ではなく、文字列として必要です。
でPyErr_Fetch()
例外の型オブジェクトと値を取得できます。上記の例では、値はタプルです。
PyErr_Fetch()
取得した情報からPython インタープリターが表示する文字列への簡単な方法はありますか? (例外タイプごとにそのような文字列を自分で作成する必要のないもの。)
python - コア ダンプ内の Python オブジェクトへのアクセス
とにかく、gdb のコアファイルから PyObject* の python 値を発見する方法はありますか?
python - Python C拡張機能:ドキュメントのメソッドシグネチャ?
私はC拡張機能を書いていますが、メソッドのシグネチャをイントロスペクションで表示できるようにしたいと思います。
ここで、(ビルド後に...)モジュールをロードして、そのヘルプを確認すると、次のようになります。
私は取得します:
もっと具体的にして、foo(...)をfoo(timeout、flags = None)に置き換えられるようにしたいと思います。
これはできますか?どのように?