問題タブ [python-cffi]
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-CFFI から ffi.gc() を使用して作成された変数への最後の参照の破棄をトリガーする必要がありますか?
インターフェイスは LuaJIT の FFI に基づいています (...)
LuaJIT Web サイト(についてffi.gc()
) を参照してください 。
この関数により、管理されていないリソースを LuaJIT ガベージ コレクターの自動メモリ管理に安全に統合できます。典型的な使用法:
したがって、Python-CFFI を使用して、インスタンス化された変数への最後の参照の破棄をトリガーするffi.gc
必要がありますffi.NULL
か?
c++ - CFFI 構造体のメモリを割り当ておよび割り当て解除する方法
私は以下のようにC++で構造を持っています
CFFI を使用してこの構造体のオブジェクトを作成し、メンバーの値を割り当てて、作成したオブジェクトを C++ の API に渡そうとしています。
ffi.dlopen ApiName(par1,par2,deltaUser,par4)を使用してロードされた dll を介して、この deltaUser を C++ の API に渡そうとすると、この時点で python がクラッシュします。Windows と Linux の両方でクラッシュが発生します。
このコードの何が問題になっていますか? 私はpython2.7とcffi 1.5.2を使用しています
トレースバックで次のログが得られます。値が最適化されていることがわかりました
ffi_call (cif=0x7ffff1189260、fn=0x7ffff0488faa、rvalue=0x7ffff118e098、avalue=0x7ffff118e078) で src/x86/ffi64.c:484 で cdata_call (cd=0x7ffff118c0dcf0、args=0x7ffffff7ee43) で cwd.cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_cend_ Objects/abstract.c:2529 の PyObject_Call (func=0x7ffff118c0d0, arg=, kw=) の 2637 Python/ceval.c の do_call (f=, throwflag=) の 2529 Python/ceval.c:4239 の call_function (f=, throwflag=) ceval.c:4044
前もって感謝します。
python-cffi - ffi.include(...) を使用した複数の ffi 定義
いくつかの cffi 定義がいくつかのプロジェクト サブディレクトリに分散しています。各 cffi ファイルは型と関数を定義し、それぞれ_<package>.py
が読み込まれるファイルにコンパイルされます。最終的なアプリケーションではffi.include()
、トップ レベルのもの (再帰的ffi.include()
に下位レベルのもの) を生成 _<app>.py
し、アプリケーションにロードするコンパイル ファイルを生成します。ffi
ファイルのロードには単一のインスタンスを使用し*.so
ます。_<package>.py
ただし、これがスプレッドファイルをアプリケーションにロードする方法がわかりません。次のエラーが表示されます (例):
2 つの別個の FFI 定義ファイル、
root/get/ffi_getA.py
およびroot/use/ffi_useA.py
どちらの C 関数も同じライブラリの一部ですlibA.so
。
ffi_getA.py
:
ffi_useA.py
:
アプリケーションで:
この混合はうまくいかないので、問題は次のとおりです。
共通/単一のffiオブジェクトを介して、コンパイルされたさまざまなffiオブジェクトにまたがるcdef関数にアクセス/ロードする方法は?
python - Python でその名前 (Python 文字列) を使用して列挙型の C 変数値をフェッチする
基本的に、私はPythonでC APIをラップしています(CFFIを使用しています(これは素晴らしいです))。
私はそのC APIに列挙型を持っています:
Python では、その列挙にある変数の名前を文字列 : として受け取ります"enum1"
。頂きたいですvalue1
。
を使用CFFI
すると、列挙型をラップしてそのメンバーに簡単にアクセスできます (ここに例があります)。ここでの問題は、変数自体ではなく、変数の名前を表す文字列があることです。
したがって、cwrapper.c."enum1"
機能しません (cwrapper
ラップするモジュールの名前であり、ライブラリのラップ中 c
に返される名前です)。ffi.dlopen(libname)
次のように、変数名を文字列として実際の変数にマップする辞書を作成できます。
しかし、この時点で、enum を Python 辞書として書き直したほうがよいでしょう。
正規表現を使用して C ファイルを読み取ることもできますが、それを処理するためのより良い方法がまだあると思います。何か案が?
python-cffi - 〜100回の反復後にCFFIセグメンテーション違反を伴う「マルチプロセッシング」からのコールバック
PyPy コールバックは、Python オブジェクトのメソッドとして (簡単に) 実装すると (無限ループで) 完全に機能しますが、Python オブジェクトを別のマルチプロセッシング プロセスに移動すると、約 100 回の反復後にセグメンテーション違反が発生します。
私が持っているメインコードでは:
複数のタスクが同数のコールバックを同時に処理する必要があるという考え方です。特に最初の〜100回程度の反復では問題なく動作するため、セグメンテーション違反の原因はわかりません。大変助かりました!
python - ソースコードを指定して、CFFI を使用して既存の C 関数を呼び出すにはどうすればよいですか?
より大きなプロジェクトの一部である C ソース/ヘッダー ファイルがあります。実際のプロジェクトとは別に、これをユニットとしてテストしたいと思います。C で別の .xml を使用して新しいプロジェクトを作成することでこれを行うことは可能ですがmain()
、Python (3) とそのフレームワーク (たとえば、nose) を使用してテストの構築を加速し、既存のレポートを使用できるかどうかを確認したいと思います。フレームワークなど
CFFIでこれができるという印象を受けました。サンプル C ファイルは次のとおりです。
ヘッダー:
これは、いくつかの関数を呼び出すことができるようにコンパイルしようとするスクリプトです。
最終的には、一連の単体テストの前に、これをセットアップの一部にする予定です。純粋な Python 関数は、テスト セットアップで構築されたオブジェクトを介してtest_add()
C 関数の結果を呼び出してチェックします。add()
ffi
上記のスクリプトは機能しているようです。エラーなしで実行され、_magic_tests.c
ファイル、_magic_tests.cp35-win32.pyd
ファイル、およびRelease
ディレクトリが作成されます。私もimport _magic_tests
エラーなしでできます。
しかし、CFFI 経由で C 関数を実際に呼び出す方法がわかりません。関数のドキュメントが見つかりませんset_source()
。プロセス全体にかなり不可欠なようです。概要では多くのことが言及されていますが、参照にはそれがまったく含まれていません。ドキュメントには関数の呼び出しに関するセクションがありますが、作成方法を示さずにオブジェクトを参照しています。前の例を見ると、から作成されたオブジェクトがありますが、それを CFFI 自体が生成しているものに適用する方法がわかりません。lib
lib
ffi.dlopen()
私の大きな質問 (つまり、私のX 問題) は次のとおりです。
- CFFI は、クロス プラットフォーム (Windows 7-10、Linux、OS X) の方法で C 関数を呼び出してテストするために使用する合理的なツールですか?
私の現在のアプローチから生じる質問 (つまり、私のY 問題) は次のとおりです。
- のドキュメントはどこにあります
set_source()
か? どのような引数が必要かを知るにはどうすればよいですか? lib
呼び出したい関数を含むオブジェクトを作成するにはどうすればよいですか?- これは、CFFI を使用して C 関数を呼び出す最も簡単な方法ですか? 共有ライブラリや再配布可能パッケージを作成する必要は特にありません。発生する必要がある場合は問題ありませんが、必須ではありません。他にどのようなアプローチを試すことができますか?
私の現在の設定は次のとおりです。
- OS: Windows10
- Python: CPython 3.5.1 32 ビット
- ピップ: 8.1.2
- CFFI: 1.6.0
- C コンパイラ:この MSDN 投稿からリンクされている Visual C++ Build Tools 2015 に付属するもの
Christoph Gohlke のリポジトリから CFFI と pycparser を使用しています。
python-2.7 - pip を使用しようとすると実行時エラーが発生する
私は無害に見えることをすることで、堂々と自分自身を台無しにすることに成功しました。
Pythonスクリプトから次のエラーが発生しました(brand ['feed'] =リクエストを送信しているURL):
だから私はインターネットに尋ねたところ、インターネットはこれを行うと言った:
それで私はそれをしましたが、同じスクリプトを実行するとRuntimeErrorが発生し続けます。シェルでpipを実行しようとしても、同じエラーが発生します!!
このエラーを検索しましたが、役立つものが見つからないようです。Windows Server 2008 R2 Standard 64ビットでpython 2.7.6を使用しています
gcc - gcc for cffi を使用してコンパイルせずに定数を評価する
共有ライブラリへの Python インターフェイスを作成しようとしています。ライブラリにはヘッダーが用意されているので、それらを入力として使用できるようにしたいと考えていcdef
ます。
ヘッダーを CFFI にロードする前に、ヘッダーを前処理する必要があることに気付きました。ただし、ライブラリ ヘッダーには次のようなコードがあります。
gcc -E
これは、プリプロセッサ ( )から次のように出てきます。
CFFI は、251 が単純な数値定数ではないことを訴えています (解析に関する限り、これは真実です)。プリプロセッサ時にこれらの整数定数を GCC に評価させる方法はありますか?
(もちろん、ヘッダー ファイルを手動で変更できることはわかっていますが、ライブラリに同梱されているヘッダー ファイルを使用できるかどうかを確認したいと思います)