問題タブ [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.
python - コンストラクターでリストを取得する Python オブジェクト拡張が、作成ステップ (SIGSEV) を通過しないのはなぜですか?
私は長い間エラーと戦ってきましたが、何が起こっているのか、なぜそれが機能しないのかについてのアイデアが不足しています。
まず、C 拡張機能を使用して Python 用の新しいオブジェクト タイプを作成しようとしています。このオブジェクトは、リスト、numpy 配列などを使用して作成されます...しかし、この部分を機能させることさえできません。
失敗する実際の最小限のコードは次のとおりです。
このコードは、ヒント (およびコピー/貼り付け) に従って記述されています: http://docs.python.org/extending/newtypes.html
Noddy コードをテストしたところ動作しましたが、4 番目のパラメーターを追加してリストを取得すると、sigsev で終了します。
上記のコードを次のようにコンパイルします。
そして、私はそれを次のように使用します: if name == ' main ': data_con = [3,4,5,6] matrix = CondensedMatrix(data_con)
PyArg_ParseTuple SegFaults in CApiも読みました
pyarg_parsetuple の後に segfault が発生する理由を知っている人はいますか?
Ubuntu 12.04、gcc 4.6.3、Python 2.7.3
ありがとう!
python - nb_inplace_addを実装すると、読み取り専用のバッファオブジェクトが返されます
インプレース追加操作の実装を書いています。しかし、何らかの理由で、結果として読み取り専用バッファーを取得することがあります(カスタム拡張クラスと整数を追加している間...)。
関連するコードは次のとおりです。
戻る(PyObject*)Tself
(または単に「自己」)のではなく、例外を発生させた場合、元のオブジェクトは正しく更新されます[いくつかを使用してチェックされますprintf
]。マクロを使用すると、(Python側で)Py_RETURN_NONE
に正しくModPoly
変換されます。None
私は何が間違っているのですか?オブジェクトへのポインタを返していますが、ModPoly
これはどのようにしてバッファになりますか?そして、私はそれらのポインターに対する操作を見ていません。
使用例:
リターンラインを次のように変更してみました。
インプレースで追加すると出力1
されます(つまり、返される値のタイプはModPolynomial
...)
python-c-extension - PythonからレガシーC関数を呼び出す
Pythonからレガシーcのサードパーティ関数を呼び出したい。関数呼び出しを簡単にするためにCapiを作成しました。私のPythonファイルで、レガシーコードライブラリとリンクするAPIの*.soをインポートしようとしました。しかし、libxxx(レガシーcライブラリ)が見つからないというエラーが表示され続けました。両方をインポートしようとしましたが、それでも同じエラーが発生しました。次に、ctypesを使用してみましたが、ctypesが見つからないというエラーが発生します。助言がありますか ?
python - PythonからサードパーティのC関数を呼び出す
Python内からサードパーティのc関数を呼び出す必要があります。これを行うために、サードパーティ関数を呼び出すためのすべての Python 固有の C コード (METH_VARARGS を使用) を持つ ac api を作成しました。このコード liba.so をサードパーティ ライブラリ libb.so にリンクしました。私の python ファイルでは、次のことを行っています。
Python は libb.so が見つからないと文句を言うようになりました。私は何を間違っていますか?
python-c-api - PythonからCファイルの#definesを参照するにはどうすればよいですか?
Pythonから参照したいビットの#defineがたくさんあるCファイルがあります。それらは十分にあるので、Pythonコードにコピーしたくありません。代わりに、Pythonから直接それらを参照するための受け入れられたメソッドはありますか?
注:ヘッダーファイルを開いて解析するだけで簡単にできることはわかっていますが、もっとPython的な方法がある場合は、それを使用したいと思います。
編集:
これらは、マスク内のビットの意味を定義する非常に単純な#defineです。次に例を示します。
python - C配列からPyArrayへ
Cython を使用せずに Python C 拡張機能を作成しています。
Cでdouble配列を割り当て、それを内部関数(たまたまFortranにある)で使用して返したいと思います。C-Fortran インターフェースが C で完全に機能することを指摘します。
このコードをデバッグしたところ、a からアルファを作成しようとするとセグメンテーション エラーが発生しました。そこまではすべて正常に動作します。関数 drecur_ が機能し、削除すると同じ問題が発生します。
では、C データの周りに PyArray を定義する標準的な方法は何ですか? ドキュメントは見つかりましたが、良い例はありません。また、メモリリークはどうですか?alpha と beta のインスタンスが保持されるように、戻る前に INCREF するのは正しいですか? それらが不要になったときの解放はどうですか?
編集NumPy cookbook にあるアプローチで、最終的に正しくなりました。
これについて自由にコメントしてください。回答に感謝します。
c++ - 非静的メソッドを PyMethodDef に登録する
MyWidget クラスの非静的メソッドを Python メソッドとして登録する方法を探しています。
MyWidget クラスは QWidget クラスで、メイン ウィンドウにあります。そのため、アプリの起動時に Python を初期化し、MyWidget クラス内の MyTableWidget (QTableWidget) から情報を取得したいと考えています。itemCount 非静的メソッドを python メソッドとして登録するのが好きです。非静的オブジェクトの登録により、以下の myPythonCommands でエラーが発生するため、実行できませんでした。
boost::python を確認しましたが、それを行う方法が見つかりませんでした。C ++内でpythonクラスを作成することはドキュメントカバーですが、私が知る限り、彼のものではありません。
あなたの誰かが方法を知っていて、私を正しい方向に向けているかどうか疑問に思っていましたか?
python - Python/C 関数が埋め込まれたファイル .c をコンパイルする
私は Python/C API の研究を始めており、いくつかの関数をテストする最初のコードを作成しています。これを書きます:
ファイル: test.c
私はコマンドでコンパイルします:
「Py_BuildValue」への未定義の参照というエラーが発生しました
私が実行した後:
これはエラーなしでコンパイルされますが、コンパイルされたファイルを実行すると、
gcc パラメータを設定するにはどうすればよいですか?
ubuntu 12.04、python 2.7.3、gcc 4.6.3 を使用し、python-dev をインストールしました。
ありがとう。
python - Python C 拡張: PyFloat_FromDouble(double) segfault を返す
最近、遅い Python コードを C 拡張に変換しました。162 回目の呼び出しで、return ステートメントで segfault を生成することを除いて、これは美しく機能します。
仕組みは次のとおりです。一度、計算したい関数をすべて呼び出す前に、データをメモリにロードします (親オブジェクトを INCREF することを忘れないでください)。
( C-array メソッドについては、http://www.scipy.org/Cookbook/C_Extensions/NumPy_arraysを参照してください)。次に、ロードされた double[][], DOSAGES を、Python から呼び出す関数で参照します。
大量のデバッグ ステートメント (ご覧のとおり) を使用して、segfault を return ステートメントにローカライズしました。つまり、python float オブジェクトのインスタンス化の後ですが、C からの return の呼び出しと、次に実行される python の行 (つまり、print("debugReturned") です) の間のどこかです。
double は奇妙な値ではなく、python オブジェクトは正しく作成されており、NULL ではありませんが、C から戻ってから python に進むまでの間にエラーが発生します。オンラインのソースは、これが INCREF/DECREF の問題である可能性があることを示唆していますが、PyFloat_FromDouble() と Py_BuildValue("f",double) は新しい参照を生成するため、INCREF する必要はないと述べています。どちらを選択しても、同じ結果が生成されます。grm_loadDosage 関数の実行中に行列を保持する PyObject を INCREF する必要があることは十分に確信していますが、その INCREF を使用した場合と使用しない場合の両方を同じ動作で試しました。
何が起こっているのですか?
ありがとう
また、スタックトレース:
python - PythonC拡張-引数としてdictを受け取る
私はC拡張機能を書いていますが、引数としてdictを受け取る方法にかなり迷っています。ドキュメントにはこれを実現する方法の詳細がないため、引数をPythonオブジェクトとして解析し、それをdictとして操作しようとしました。
しかし、コードは解析に失敗します:
エラーメッセージから理解できる限り、charの形式は間違っています(「o」はPythonオブジェクトを表す必要があると思いました)。
Python dictをCポインターに解析するための最良の方法は何ですか?ドキュメントを調べていますが、これに似たものは見つかりませんでした。
ありがとうございました。