問題タブ [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 - PyArg_ParseTuple とコールバック関数ポインタ
次のようなコードがあります。
PyArg_ParseTuple 内で正確に何が起こるのでしょうか? 私の推測では、コールバックは、args (PyObject* も) に渡した関数ポインターを取得します。PyArg_ParseTuple はどのように関数ポインタを PyObject* に変換しますか?
私が知りたいのは、同じコールバック関数ポインターを 2 回渡すとどうなるかということです。コールバックは PyArg_ParseTuple 内で新しい PyObject を割り当てられると思うので、毎回異なるメモリ アドレスを取得しますが、同じコールバック関数ポインタが含まれます。
しかし、PyObject_Hash コールバックを実行すると、毎回異なる値が生成されますよね? (アドレスが毎回違うので…)
python - PythonおよびOpenMPC拡張機能
OpenMPを使用したいC拡張機能があります。ただし、モジュールをインポートすると、インポートエラーが発生します。
モジュールを-fopenmpと-lgompでコンパイルしました。これは、Pythonのインストールが-fopenmpフラグを使用してコンパイルされていないためですか?ソースからPythonをビルドする必要がありますか?それとも他の可能性はありますか?モジュールで実際にopenmpを使用するのはこれだけです。
可能であればopenmpを使い続けたいと思います。それは、それがとても簡単で、この場合の並列化がそれに適しているからです。
編集:私は弾丸を噛み、OpenMPをサポートしてPythonを再コンパイルしました。私のモジュールは完全に機能するようになりましたが、これは実際には優れたソリューションではありません。Pythonの完全な再コンパイルが必要な場合、これを実際に配布することはできません。それで、誰かがこれを回避する方法を知っていますか?ctypesは機能するでしょうか?
解決しました!それは単純なリンクの問題でした。(そのためにPythonを再構築しましたか?!)モジュールのコンパイル中にOpenMPが適切にリンクされていませんでした。したがって、OpenMPを使用するCPython拡張機能をロードすることは可能です。
python - Python C拡張機能はスレッドセーフではありませんか?
かなり労力のかかる python スクリプトから ac 拡張機能を作成しました。コード自体は十分にテストされており、単純です。c 拡張機能は、いくつかの大きなリストで呼び出され、巧妙な演算を実行していくつかの新しいリストを返します。c 拡張は 100% 自己完結型であり、他の c 関数を使用せず、python オブジェクトのメソッドも使用しません (ただし、これらの標準的な Python メソッドを使用します: PyFloat_AsDouble、PyList_GetItem、PyList_Size、PyList_New、Py_BuildValue、PyList_Append )。これまで、非マルチスレッド環境でしか使用していませんでした。
今日、私はマルチスレッド GUI 環境でそれを使い始めました。デバッグに使用するいくつかのテストケースがありますが、奇妙なことに、小さいものは問題なく通過しますが、大きいものはバスエラーとセグメンテーション違反を引き起こします (GUI が完全にクラッシュし、OS X で「Python の問題レポート」ウィンドウが表示されます)。 . 私の c エクステンションがスレッドセーフではないという問題はありますか? もしそうなら、どうすればスレッドセーフにできますか? この件についてグーグルで調べてみましたが、意味をなすような良い情報は見つかりませんでした。これとこのページをチェックしましたが、彼らが何を言っているのかよくわかりません。GIL を必要とするのはどのタイプのコードで、どのタイプのコードは不要ですか?
ここで価値があるのはダンプです:
python - Python パッケージのオプションの C 拡張機能を作成する最も簡単な方法は何ですか?
コマンド ライン オプションが渡された場合にのみ、Python パッケージで (setuptools を使用して) 有効にしたい C 拡張機能を作成しました。これを行う最も簡単な方法は何ですか?
これについて簡単な方法を見つけることができないようです。
python - この C メソッドのセグメンテーション違反はなぜですか?
不変のリンク リスト クラスを C で作成していますが、1 つのメソッドが不思議なことにセグメンテーション違反を起こしています。コードは、これとほぼ同等になるように意図されています。
これが私のコードです:
このコードを実行すると、最後の行でセグメンテーション違反が発生します。
私は愚かなことをしているだけだと確信していますが、それが何であるかはわかりません。足りないものはありますか?
python - 動的バイナリ インストルメンテーション フレームワーク PIN への Python インターフェイス
Python を使用して、バイナリ ファイルの分析に取り組んでいます。私はデバッガーを使用して動的分析を行っています (つまり、アプリケーションを実行し、ブレークポイントを使用してランタイム実行を取得します)。ただし、 PINなどのバイナリ インストルメンテーション フレームワークを使用できれば、結果を改善できます。PIN は C++ で開発され、クローズド ソース (dll のみ) として提供されます。PinTools と呼ばれるものを作成し、インターセプトする場所と対象を記述します。Python を引き続き使用できるように、PIN 機能を Python に移植したいと考えています。「ctypes」とboost-pythonを認識しています。
私の問題は、PIN を使用するために、pintool を作成し、Pin と pintool を使用してバイナリ実行可能ファイルを実行することです (JIT を使用してアプリケーションを実行するようなものです)。さて、ctypesなどを使用してPIN関数をインポートし、このpythonコードを使用してバイナリを動的に分析できるかどうかはわかりません。このタスクの進め方について、提案やガイドラインを教えてください。
そこで、基本的に、PIN フレームワークへの Python インターフェイス (ラッパー) を作成したいと思います。
python - Python/C:Pythonに戻るために一度にすべての値を解析しますか?
C から Python の dict に多くの値を出力している場合、次の方法よりも優れた (より迅速でエラーが発生しにくい) 方法はありますか?
python - DYLD_LIBRARY_PATH/LD_LIBRARY_PATH の代替
OSX と Linux の両方で使用する Python C++ 拡張機能を開発しています。現在、ラッパー スクリプトを使用してコードを実行できますwrapper.sh
。
これは私の実行を次のように設定できます:wrapper.sh app.py
私がやりたいのは、の必要性をなくすことですwrapper.sh
。そのため、DYLD_LIBRARY_PATH と LD_LIBRARY_PATH の代わりが必要です。/usr/local/lib
私のマシンでは、ライブラリのいくつかの独立したインスタンスを維持しているため、ライブラリを標準的な場所に置くことはできません。つまり、ライブラリは、インストール パスに相対的な場所に保持する必要があります。同じ理由で、これらの環境変数をログイン スクリプトに入れることができません。現在、関連付けられているライブラリwrapper.sh
を使用するには、スクリプトの 1 つを呼び出す必要があります。私の目標は、単に実行できるようにすることです。これは、インストール パスに存在する場合、関連する python とライブラリを見つけることができるはずです。目的は、ユーザーの実行を簡素化し、nosetests などの外部ツールの使用を簡素化することです。app.py
私のバージョンのpythonをビルドするときに、1つの代替手段はrpathを使用しているようです:
trunk/src/python/lib/python2.6/lib-dynload
私のライブラリの1つが何らかの理由で直接コピーする必要があったとしても、このトリックはLinuxでうまくいくようです。ただし、このトリックは OSX では機能しません。install_name_tool
すべての dylibs ライブラリで実行する必要があるようです。
私が思いついた他の選択肢は、次のようなことをすることでした:
私のスクリプトがすべて使用できるようにしまし#! ../python
たが、Unmatched ".
エラーが発生しました。を使っても同じです#! ../wrapper.sh
。私は本当にbashの専門家ではありません...
しかし、これらはすべて不必要に複雑に思えますが、これは他の人が解決したものなのでしょうか?? アドバイスをありがとう!
python - Python Cコードからどのようにアサートできますか?
私はCでPythonクラスを書いていますが、デバッグコードにアサーションを入れたいと思っています。assert.h
私にぴったりです。これはデバッグコンパイルにのみ入れられるため、Pythonコード*のユーザーに影響を与えるアサートエラーの可能性はありません。
「ライブラリ」コード(Pythonに対してリンクされたコードとは別にする必要があります)を分割して、他のCコードから使用できるようにしようとしています。したがって、私のPythonメソッドは、純粋なCコードの薄いラッパーです。
したがって、「ライブラリ」コードではこれを行うことができません。
これは私の純粋なCコードをPythonで汚染するからです。また、単純なものよりもはるかに醜いです
Distutilsコンパイラは常にを設定すると思います。つまり、デバッグビルドでもNDEBUG
使用できません。assert.h
MacOSとLinux。
ヘルプ!
*Pythonから呼び出されたCコードでのアサートに対して私が聞いた1つの引数。
python - CからCTypesポインタを返す
メモリ内の配列へのCTypesポインターを返す必要があるPythonC拡張機能を作成していchar
ます(CTypesポインターを期待する別のPythonライブラリとインターフェイスする必要があります)。
CのCTypesインターフェイスの種類に関するドキュメントが見つかりません。Pythonポインターコンストラクターを呼び出すなどの回避策はありますか?
前もって感謝します。