問題タブ [pycxx]

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.

0 投票する
1 に答える
3914 参照

python - Python はインスタンスを作成できません

PyCXXを使用して単純な Python 拡張機能を作成しようとしています。そして、Python 2.5 インストールに対してコンパイルしています。

私の目標は、Python で次のことができるようになることです。

しかし、私が試みるたびに、これは私が得るエラーです:

TypeError: cannot create 'Kitty' instances

型オブジェクトとして表示Cats.Kittyされますが、Kitty クラスのインスタンスを作成できません。アイデアはありますか?

これが私の現在の情報源です:

0 投票する
2 に答える
1405 参照

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 で両方の子猫にニャーと鳴いています! ただし、まだ完全ではありません。

だからまだ助けを探しています!ありがとう!

0 投票する
1 に答える
375 参照

python - PyCXX内でnumpy配列にアクセスする方法

C++ 側で numpy 配列を double* または stl ベクトルに変換したいと思います。私は実際にこれに PyCXX を使用していますが、データにアクセスする方法がわかりません。

私は現在、次のようにデータバッファにアクセスして返すことができます:

しかし、私はそれをどうするかわかりません。私の最終的な目標は、そこから gsl_vector を取得することです。理想的には、メモリを再コピーする必要はありません。しかし、多分それはあまりにも多くを求める;)

0 投票する
1 に答える
166 参照

python - PyCXX 拡張機能で属性を定義する適切な方法は何ですか?

PyCxx で生成された Python 拡張機能で属性を定義する適切な方法は何でしょうか。Py::PythonClass現在、公式ののようにサブクラスを作成しています。初期化関数を追加behaviors().supportGetattro();し、単純なオーバーライドを作成しました

ここまでは順調ですね。pythonでは、で適切な値を取得しますが、満足できないのは、属性obj.nameを呼び出すときにリストされないことだけです。どうすればそれを変更できますか?dir(obj)name

0 投票する
1 に答える
588 参照

python - PyCXX を使用して組み込み Python ランタイムにモジュールをロードする

PyCXXを使用して、組み込み Python ランタイムの C++ ラッパーを作成しています。

PyCXX には実行可能ファイルの例がないようです。そのため、既存のサンプル コードを適応させようとしています。

Python インタープリターを簡単に起動して実行できます。

これにより、完全に機能する Python プロンプトが Xcode のデバッグ/出力ウィンドウに表示されます。

次に、テスト C++ クラスを公開して、Python 内で表示できるようにします。rangeこの目的のために書かれたクラスがあります:

わかりました、それも機能します。

しかし今、モジュールをロードしようとしています。

「simple.cxx」と呼ばれる簡単なデモ モジュールがあり、次のものが含まれます。

そして、クラスは、初期化子を持つクラスからsimple_module派生した PyCXX のExtensionModuleクラスから派生します。ExtensionModuleBase

私の理解が正しければ、意図した用途は、この .cxx をライブラリ (OS X では .so) にコンパイルし、Python の検索パスのどこかに配置することです。

ただし、別のライブラリをコンパイルしなくても、これを機能させることができるはずです。これが私がやろうとしていることです。

ここでドキュメントを使用しています: https://docs.python.org/3.4/extending/embedding.htmlを使用するように指示されていますPyImport_AppendInittab

これで、プロンプトからこのモジュールを確認できるはずです。といいsimpleます。

うまくいかなかったようです。

私は何が欠けていますか?

0 投票する
2 に答える
3152 参照

python - PyCFunction_New / PyCFunction_NewEx のドキュメント

PyCFunction_New を中心に展開するPyCXXコード (C++ Python ラッパー)を理解するのに苦労しています。

誰かがこの機能がどのように機能するか説明できますか?

(CPythonソース コードからはわかりません。)


ここでは、私が抱えている問題について詳しく説明します。これはおそらくそれほど一般的な用途ではないため、上記の行に罫線を付けました。

尋ねる理由は、私が奇妙なコードを扱っているからです。私はキーワードメソッドハンドラ関数を持っています:

次のように保存されています。

次に、PyCFunction_New にバンドルされます。

最初のパラメーターが args (ハンドラーの _self_and_name_tuple の最初のパラメーターと一致する) である 3 パラメーター関数に、CPython が型キャストを処理すると仮定するのは正しいでしょうか?

そして、CPython は、「myFunc(7, a=1)」を解析しなければならないという事実から、実際には 3-param 関数とも呼ばれるキーワードを実際に扱っていることを知るだけでしょうか?

これは正しくないようです。

たぶん、CPython は args 1を PyMethodDef に型キャストし、.ml_flags を検査しています。

それが起こっている場合、私が作業しているコードには次のようなものがあるため、知る必要があります。

元の形式では、PyMethodDef の 2 つのコピーがあったに違いないと思います。

これが実際に起こっている場合、つまり、このクラスが実際に PyCFunction_New の内部によって PyMethodDef に型キャストされている場合、これは危険です。

確かに、誰かが MethodDefExt の前にメンバー変数を追加すると、型キャストが壊れます。これは薄っぺらい…


私が扱っているクラスは、将来の C++ コーダーがカスタム Python タイプを実装し、このタイプ内で Python から呼び出すことができるメソッドを実装できるようにします。

そこで彼らはMyExt : CustomExtを派生させ、メソッドを書きます:

次に、これら 3 つの関数の適切な 1 つを呼び出して、このメソッドをlookupに格納する必要があります。

それぞれに関連付けられたハンドラ関数があることに注意してください。これらのハンドラ関数は、CustomExtの静的メソッドです。静的メソッドへのポインタは CPython から呼び出すことができるためです。つまり、これは単なる標準 C スタイルの関数ポインタです。

したがって、Python がこのfoo関数のポインターを必要とする場合、ここでインターセプトします。

このメソッドのハンドラーを呼び出す Python 関数を作成します (このオブジェクト args[0] にメソッド自体の詳細 args 1を渡します)。ハンドラーは、エラーをトラップしながらメソッドを実行します。

この時点ではハンドラーを実行しないことに注意してください。代わりに、この Python 関数を Python ランタイムに戻します。Python コーダーは、関数を実行することを望まず、関数へのポインターを取得したかっただけかもしれません: fp = MyExt.func;

X (下記参照) & method_def_ext->meth_def は、3 つのハンドラーの 1 つであるハンドラー関数を引き出します。ただし、MethodDefExt s コンストラクターのおかげで、それらはすべて PyCFunction オブジェクトに型キャストされています。これは、キーワード ハンドラーのパラメーター リストが間違っていることを意味します。

(SOのフォーマッタがコメントをコードコメントとして処理していなかったため、コメントを分割する必要がありました)

私が苦労しているのはこれです: fooがキーワードを取る関数であるとしましょう。したがって、その署名は次のようになります。

一致するハンドラーは次のようになります。

つまり、3番目のもの。Python が追加の最初の_self_and_name_tupleパラメータを提供していることを読みました。

foo をルックアップに登録するときは、次のハンドラーを提供します。

MethodDefExtの特定のコンストラクターを見ると、

... このハンドラーをPyCFunctionに型キャストすることがわかります

しかし、PyCFunctionは 2 つの引数しか取りません!!!

これにハンドラーを型キャストしています。そして、これらのハンドラーには 2 つまたは 3 つのパラメーターがあります。

これは本当に間違っているように見えます。

そして、上記のように、CPython が foo を実行したい場合、このmeth_def.ml_methを取得してPyCFunction_Newにフィードします。

だから私は推測することができます: * PyCFunction_New の最初のパラメーターは PyCFunction 関数ポインターでなければなりません * 2 番目のパラメーターは PyObject でなければなりません* _self_and_name_tuple

そして、これを CPython にフィードバックしています。私の推測では、CPython が 'foo(7, a=1,b=2)' を使用したい場合、7 を args にパッケージ化し、a=1,b=2 を kwds にパッケージ化して呼び出します。 :

0 投票する
2 に答える
421 参照

c++ - テンプレートを使用したインスタンス メソッドのトランポリン関数への static のコーディング

やや醜いテンプレートコーディングを書き直そうとしています。

参考までに、オリジナルはこちら: https://codereview.stackexchange.com/questions/69545/recode-cc-trampoline-function-macros-using-templates

私のコードは CPython (C ライブラリ) とインターフェイスします。Python ランタイムは "myInst.foo" を認識し、テーブルで "foo" を検索して呼び出します。

(静的メソッドを C 関数ポインターに型キャストできることに注意してください)

FooHandler は、Final の正しいインスタンスの Foo メソッドにトランポリンします。

実際には、ハンドルはそれほどきれいではなく、それぞれが同一のハンドラーを必要とするメソッドが多数あります (ただし、関数アドレスは異なります)。

ハンドラーメカニズムを次のような基本クラスに抽象化しようとしています:

現在、コンパイラ エラー ( http://ideone.com/vOtbcD ) でスタックしているため、この手法が有効かどうかさえわかりません。

これを行う方法はありますか、それとも本当にマクロが必要な場合の 1 つにすぎませんか?

参考までに、オリジナルはこちら: https://codereview.stackexchange.com/questions/69545/recode-cc-trampoline-function-macros-using-templates

ご覧のとおり、オリジナルはかなり醜いマクロを使用しています。

0 投票する
2 に答える
359 参照

memory-management - C-API: "PyTypeObject-extension" の割り当て