問題タブ [python-c-extension]

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 に答える
2790 参照

python - PyArg_ParseTuple のデフォルト引数

次の関数があり、オプションの引数myobjが渡されない場合、myobj残りますNULLか、またはに設定されPy_Noneますか?

Parsing arguments と building valuesによると、

|Python 引数リストの残りの引数がオプションであることを示します。オプションの引数に対応する C 変数は、デフォルト値に初期化する必要があります — オプションの引数が指定されていない場合、 PyArg_ParseTuple() は対応する C 変数の内容に触れません。

これはsに当てはまりますPyObject *か?これは明らかにCに存在するポインタであるため、C変数であると言えますが、Pythonオブジェクトへのポインタであるため、C変数としてカウントされないと言うこともできます.

0 投票する
3 に答える
2872 参照

python - Python C拡張機能-呼び出し可能なC関数が引数を取り、PyObjectを返す必要があるのはなぜですか*

私はPythonC拡張機能を使い始めたばかりで、Pythonから呼び出し可能なC関数が2つのPyObject*引数を取りPyObject*を返さなければならない理由に興味があります。次の「HelloWorld」拡張機能を作成しました。

(特にMETH_NOARGSで)次のhello_worldメソッドを使用できないのはなぜですか。

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

python - Pythonの長整数をC文字配列に変換します

私はPython/C APIを使用しており、C関数でPythonの長整数引数を取り、それを10nPyLong進数のchar配列に変換しnStringたいと考えています。これが私がやりたいことの抜粋です。

APIリファレンスにはPyObject* PyLong_FromString(char *str, char **pend, int base)、任意のベースを指定してC char配列をPythonの長整数に変換する関数が記載されていますが、その逆を行う関数が見つかりません。

これは可能ですか?1つのアイデアは、Pythonの長整数をPythonの文字列オブジェクトに変換してからCのchar配列に変換することですが、長い整数を処理する文字列関数もありません。CがPythonのlongintを処理する唯一の方法は、Cのint型に変換することであるように思われます。これは、すべて私のアプリケーションでオーバーフローします。

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

python - Python C 拡張機能 - キーワード引数を使用するメソッドが PyCFunction にキャストされる理由

私は Python-C 拡張機能について学んでおり、キーワード引数を使用するメソッドを PyCFunctions にキャストする必要がある理由について困惑しています。

PyCFunction についての私の理解は、PyObjects への 2 つのポインターを取り、PyObjects への単一のポインターを返すということです。

キーワード引数を使用する関数を使用する場合、この関数は PyObjects への 3 つのポインターを取り、PyObjects への単一のポインターを返します。

ただし、モジュール関数配列を作成すると (「adder」という関数の場合):

正常に動作します。float を int にキャストしても、float の非整数部分を使用する必要があるように感じます。この作品を見なかったら、うまくいかないと思っていたでしょう。ここで何が理解できませんか?

また、PyCFunctionWithKeywords への参照をいくつか見ました。これは、私が必要だと思った関数シグネチャを持っているようですが、コンパイラは「互換性のないポインター型」について不平を言いました (警告を出しました)。

PyCFunctionWithKeywords は廃止されましたか? そうでない場合、それを使用すべき/使用しなければならない時期はありますか?

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

python - PyList_SetItemとPyList_SETITEM

私の知る限り、PyList_SetItemとPyList_SETITEMの違いは、PyList_SetItemは上書きするリスト項目の参照数を減らし、PyList_SETITEMは下げないことです。

いつもPyList_SetItemを使うべきではない理由はありますか?または、PyList_SetItemを使用してリスト内のインデックス位置を初期化すると、問題が発生しますか?

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

python - Python C拡張に渡されたnumpy配列要素を変更するには?

これは些細な質問ですが、初心者にはわかりませんでした。

numpy 配列を使用した次の Python C 拡張があります。

共有ライブラリとしてコンパイルした後、次の呼び出しで要素 clmn 配列を「1」に変更できないことがわかりました。

前もって感謝します!

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

c++ - Python CAPIはC++と完全に互換性がありますか?

CとC++の関係を理解し​​ているので、後者は本質的に前者の拡張であり、ある程度の下位互換性を保持しています。Python CAPIをC++コードで呼び出すことができると想定しても安全ですか?

さらに重要なことに、公式のPythonドキュメントにはCとC++の拡張機能が同じページにバンドルされていることに気付きました。C++APIはどこにも見つかりません。これにより、同じAPIを両方の言語で安全に使用できると私は信じています。

誰かがこれを確認または拒否できますか?

編集:

質問を必要以上に複雑にしたと思います。問題はこれです:C ++でPythonモジュールを書くために私は何をしなければなりませんか?ここにリストされているのと同じ指示に従い、C ++の代わりにCコードを使用しますか?別のAPIはありますか?

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

python - PyMODINIT_FUNC と PyModule_Create の違い

私の理解が正しければ、

  1. Python 2.X の PyMODINIT_FUNC は Python3.X で置き換えられましPyModule_Createた。
  2. どちらも を返しPyObject*ますが、Python 3.X では、モジュールの初期化関数は をモジュールに返さなければなりませんPyObject*。つまり、

    一方、Python2.X では、これは必要ありません。

    /li>

したがって、私の健全性チェックの質問は次のとおりです。

  • 私の理解は正しいですか?
  • なぜこの変更が行われたのですか?

現在、私は Python の C 拡張の非常に単純なケースのみを試しています。おそらく、私がもっとやっていたら、これに対する答えは明らかだったでしょう。あるいは、Python を何か他のものに埋め込もうとしていたのかもしれません....

0 投票する
3 に答える
174 参照

python - PythonのCコードC-APIがptrをスタック変数に返すようです。私は何が欠けていますか?

次のコードスニペットを見たときに、Python用のC拡張機能の作成について学習しようとしているため、ファイルmethodobject.cを読んでいました。

見れば見るほど

理解すればするほど理解できません。methへのポインターを返していると思います。これは、self(ローカルで宣言されたポインター)とarg(PyCFunctionCallに外部から渡されたポインター)を受け取る関数です。ただし、me​​thとselfがスタックに割り当てられているように見えるため、PyCFunctionCallが終了すると解放され、渡される変数に問題が発生します。

ここで何が欠けていますか?

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

python - PyArg_ParseTupleAndKeywords はどのように機能しますか?

私は Python 用の C 拡張機能を作成する方法を学ぼうとしており、PyArg_ParseTupleAndKeywords がどのように機能するかを確実に理解したいと考えています。

最初の引数は、渡された順序で C 拡張関数に渡される引数の配列を指す PyObject ポインターであると思います。2 番目の引数は、渡されたキーワードのリスト、それらが渡された位置、およびキーワードがどの位置で始まり、その位置が無関係になるかを示す何らかの標識フラグである可能性が非常に高いです。

次に、PyArg_ParseTupleAndKeywords は、キーワードのリスト (4 番目の引数) を使用して、キーワードで指定された引数と、適切な値がコピーされるフォーマット文字列 (3 番目の引数) と C 変数のアドレス (5 番目 & + 引数) の両方をマップします。

私の理解は正しいですか?オンライン ドキュメントを読んでいると、「位置引数とキーワード引数」への参照しか表示されず、少し暗い気分になります。PyArg_ParseTupleAndKeywords を処理する Python インタープリターのファイルはどこにありますか?