問題タブ [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 - PyEval_CallObject が時々ループで失敗する
Python C API で少し苦労しています。約 60hz でゲーム AI を実行するために Python メソッドを呼び出しています。ほとんどの場合は機能しますが、1 秒おきに PyEval_CallObject を呼び出すと、戻り値が NULL になります。エラーを正しく検出してループを続行すると、次の 1 秒ほどは問題なく動作しますが、エラーが再び発生します。
私は参照カウントで何か間違ったことをしていると思いますが、それが何であるかわかりません:
ええ、繰り返しごとにモジュールをインポートしています。それは必要ですか?pAiModule をグローバルとして保存すると、約 1 秒後にハード クラッシュが発生します。
私はまだ例外を抽出する方法を見つけることができませんでした...すべての例外をテストすることなく
私はこれを正しく行うことに近づいていますか?私が言ったように、それはほとんど動作しますが、エラーが発生する理由を本当に理解したいです.
よろしくお願いします。
python - itemsize > 1 の Python 3.x バッファーへの代入
Python 3.x バッファー インターフェイスを介して画像ピクセル情報 (32 ビット RGBA) のバッファーを公開しようとしています。かなり遊んだ後、私はこれを次のように機能させることができました:
そしてPythonでは、次のように遊ぶことができます:
そして、それは見事に機能します。ただし、個々のバイトではなく、完全なピクセル値 (int、4 バイト) で作業できれば素晴らしいので、バッファ フェッチを次のように変更しました。
これは実際にデータを返し、正しく読み取ることができますが、値を代入しようとすると失敗します!
ケース 1 の場合、エラーで が通知されますが'int' does not support the buffer interface
、これは残念で少し混乱します (結局、バッファー形式が "I" であることを指定しました) が、対処できます。mismatching item sizes for "my.Image" and "bytes"
ただし、2 と 3 の場合は非常に奇妙になりますmy.Image
。
私が渡すデータは明らかにその要素から得られるものと同じサイズであるため、これは私にとって非常に混乱します。itemsize が 1 より大きい場合、バッファは単純に代入を許可しないように見えます。もちろん、このインターフェイスのドキュメントは非常にまばらで、Python コードを熟読しても実際には使用例がまったく得られないため、かなり行き詰まっています。「itemsize > 1 の場合、バッファは本質的に役に立たなくなる」というドキュメントの一部が欠けているのでしょうか、何か間違ったことをしているのに見えないのでしょうか、それとも Python のバグですか? (3.1.1に対するテスト)
この(確かに高度な)問題についてあなたが与えることができる洞察に感謝します!
python - Python から C に構造体の配列を渡す
【追記:問題解決!投稿の下部を参照]
Python 開発者がパックされたデータ (この場合は頂点) の配列を API に渡せるようにする必要があります。これは、Python C API を介して手動で公開された一連の C++ インターフェイスです。これに関する私の最初の印象は、ctypes Structure クラスを使用して、次のようなインターフェイスを可能にすることです。
渡そうとしている関数には、次の署名があります。
Python ラッパーは次のようになります。
もちろん、私が抱えている最大の問題は次のとおりです。構造体の PyObject を取得できますが、それを正しい型にキャストする方法がわかりません。上記のコードは惨めに失敗します。では、ユーザーがこの種のデータを Python から渡してくれるのをどのように許可すればよいのでしょうか?
さて、考慮すべき点がいくつかあります。まず、かなりの量の Python/C++ 層が既に作成されており、それに完全に満足しています (SWIG から離れたので、柔軟性を高めることができました)。再コーディングしたくないので、C API でネイティブに動作するソリューションを希望します。次に、Vertex 構造体を C++ コードで事前に定義するつもりなので、ユーザーが Python で再定義する必要がないようにしたいと思います (その方法でエラーを減らします)。そのような連続した構造を公開する方法がわかりません。第三に、ctypes 構造を試す理由が他にありません。別の方法を知りません。どんな提案でも大歓迎です。最後に、これは (ご想像のとおり) グラフィックス アプリ用であるため、高速な方法が少し手間がかかるとしても、便利な方法よりも高速な方法をお勧めします。
助けてくれてありがとう!Python 拡張機能についてはまだ手探りの状態なので、重要な部分についてコミュニティの意見を聞くことは大きな助けになります。
[解決]
まず最初に、アイデアを提案してくれたすべての人に感謝します。最終的な答えにつながったのは、多くの小さな情報でした。最後に、私が見つけたものは次のとおりです。struct.packを使用するというSamの提案は、最終的にはお金に見合ったものになりました。私は Python 3 を使用しているので、微調整する必要がありましたが、最終的には、画面に三角形が表示されました。
タプルの解析は次のようになります。
この例では変数を使用していませんがlen
(最終製品では使用しますが)、単に 'y' の代わりに 'y#' を使用してタプルを解析する必要があることに注意してください。そうしないと、最初の NULL (ドキュメントによると)。また、考慮すべきこと: このような void* キャストは非常に危険です。そのため、ここで示すよりも多くのエラー チェックを実行してください。
それで、仕事はよくやった、幸せな一日、荷物をまとめて家に帰りますか?
待って!そんなに早くない!もっとあります!
すべてがうまくいったことに満足していたので、気まぐれで、前回の試みがまだうまくいかないかどうかを確認し、この投稿の python の最初のスニペットに戻ったかどうかを確認することにしました。(もちろん、新しい C コードを使用して) そして... うまくいきました! 結果は struct.pack バージョンと同じでした! わお!
したがって、これは、ユーザーがこの種のデータを提供する方法を選択できることを意味し、コードは変更なしでどちらも処理できます。個人的には、読みやすくするために ctype.Structure メソッドをお勧めしますが、実際には、ユーザーが快適に使用できる方法です。(ほら、彼らが望むなら、16 進数でバイトの文字列を手動で入力することができます。それは動作します。私は試しました。)
正直なところ、これが可能な限り最高の結果だと思うので、私は有頂天です。この問題に遭遇した他のすべての人に幸運を祈ります。
python - PythonCAPIの静的変数
このような「静的」変数をどのように公開しますか
C API経由ですか?動作するように見えるPyTypeObjectの唯一の変数はtp_membersですが、メンバーがインスタンスごとではなくクラスごとであることを示すフラグがPyMemberDefに表示されません。
もう少し明確にするために、答えが変わる可能性があるため、列挙型が次のようになるようにCの列挙型をPythonに公開しようとしています
Pythonでは次のようにアクセスできます。
python - Python の C-API で特定のユニコード文字を生成するにはどうすればよいですか?
私は、Py_UNICODE 配列を介して実行される Python 拡張機能を作成しており、特定の (問題がある場合は ASCII) 文字、つまり '\' または '\n' を検出し、検出した文字ごとにいくつかの追加処理を行います。
これらの文字をリテラルとして記述する方法はありますか? そうでない場合、Py_UNICODE のサイズと内部表現がシステムによって異なる可能性があることを念頭に置いて、それらの Py_UNICODE を取得する正しい方法は何ですか?
python - Python C API からトレースバックを取得する
私は Python C API 拡張モジュールを持っていますが、これは時折、情報のない「MemoryError」で失敗します。モジュールの例外ハンドラによって処理されるエラーではないことは明らかです。拡張モジュールで何が問題なのかを理解できるように、より有益なエラー トレースバックを取得するにはどうすればよいですか?
おそらく問題は、私が拡張モジュールのソース コードを持っていることを考えると、MS Windows 上の MSVC でデバッグ可能なバージョンを取得するにはどうすればよいでしょうか?
c++ - Python C API で PyMyType_Check メソッドを実装していますか?
Python が提供するすべての型にはPyList_Check
、任意PyObject*
の型が実際に特定の型であるかどうかを確認できる check メソッド (つまり ) があります。
自分のタイプにこれを実装するにはどうすればよいですか? 私はこれに適したものをオンラインで見つけていませんが、やりたいことはかなり普通のことのようです.
また、大規模なソース ツリーを調べるのが苦手なだけかもしれませんがPyList_Check
、Python (2.5) ソースの実装またはそのコンパニオンを見つけることはできません。
python - Python3でPyBytesObject型をPyUnicodeObject型に変換するには
pyunicodeobject型をpybytesobject型に変換するには?
例:
その結果、バス エラーが発生しました。
python - numpy 配列 C API
std::vector を返す C++ 関数があり、それを Python で使用したいので、C numpy API を使用しています。
Pythonから呼び出す方法は次のとおりです。
何が起こるか: 最初の印刷は問題なく、値は正しいです。しかし、私がプロットa
すると、そうではありません。1E-308 1E-308 ...
2 番目のプリントでは、または0 0 0 ...
初期化されていないメモリのような非常に奇妙な値が表示されます。最初の印刷がOKな理由がわかりません。
部分的な解決策 (機能しない):
python - Cコードを処理する際のPython参照カウント/ガベージコレクションの落とし穴はありますか?
そのため、 PythonをSchemeプログラムに埋め込むことができるように、libpythonにバインドするSchemeを作成することにしました。私はすでにPythonのCAPIを呼び出すことができますが、メモリ管理についてはあまり考えていません。
mzschemeのFFIが機能する方法は、関数を呼び出すことができ、その関数がへのポインターを返す場合PyObject
、参照カウントを自動的にインクリメントさせることができます。次に、Schemeオブジェクトがガベージコレクションされたときに参照カウントをデクリメントするファイナライザーを登録できます。参照カウントのドキュメントを確認しましたが、一見したところ問題はありません(ただし、場合によっては最適ではない場合もあります)。私が見逃している落とし穴はありますか?
また、サイクリックガベージコレクタのドキュメントの先頭または末尾を作成するのに問題があります。ここで心に留めておくべきことは何ですか?特に、Pythonに何かへの参照があることを認識させて、まだ使用している間はそれを収集しないようにするにはどうすればよいですか?