問題タブ [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 - フォーマットされた Python 文字列を関数呼び出しでバイト配列として使用できない
かなり面倒な Microchip デバイス用の API を持っているので、コードC
をインクルードするさまざまな方法を学んでいます。これにより、テストをはるかに高速に行うことができます。それを行う1つの方法は、基本的にコンパイラーを呼び出して、提供されたものが正しいかどうかをチェックすることをユーザーに提供するモジュールを使用することです。Python
Python
cffi
verify()
C
cdef(...)
最初に適切に使用する方法を学ぶことができるように、小さなプロジェクトを作成しましたcffi
。2つの部分で構成されています
ライブラリ- C で書かれています。私はそれに応じてそのコードをコンパイルするために使用
cmake
しmake
ます。CMakeLists.txt
testcffi.h
/li>testcffi.c
Python でのテスト コード
/li>struct
- コードは、上記のライブラリの 3 つの関数と共にの使用法を示しています。
Python
問題は、コード内のそれぞれの場所にデータを渡すために文字列を変換する必要があるバイト配列に起因しC
ます。
上記のコードは機能していますが、 に似た他の文字列を使用したいと思いますb'hello'
。そのため、format()
(短い形式の とともに%
) inを使用Python
して、一連の文字と数字を組み合わせようとしましたが、. うまくいきませんでした。my のパラメーターの""
値として取得するか、奇妙な交互のガベージ データ (文字でも数字でもないほとんどの奇妙な文字) を取得します。label
point_t
struct
encode()
関数を間違って使用していると思いましたが、Python
インタラクティブシェル内でテストしたところ、 を使用した場合と同じ出力が得られましたb'...'
。
ここで何が起こっているのか分かりますか?
知っておくと便利な質問:これまで読んだことからcffi
、ガベージ コレクションを使用してPython
、C コードで動的に割り当てられたメモリの割り当てを解除しているようです。たくさんのポイントでテストしましたが、これが実際に常に当てはまることを確認したいと思います。
更新:
わかりました。new(...)
動作しないように見えますが、その場合、すべての値はループ内の最後の値と同じです。たとえば、ループが 10 に達すると、すべてのstruct
Python オブジェクトのラベルに 10 が含まれます。これは参照の問題のようです。使用するnew(...)
と、ガベージデータが取得されます。
python - Python CFFI で ffi.addressof で作成されたポインターを逆参照する (C *-operator と同等ですか?)
Python CFFI では、上記のコードはvalues
asの最初の要素へのポインターを作成しますpValue
。
その後、 でそのコンテンツにアクセスできますがvalues[ 0 ]
、これは実際には透過的ではなく、どのインデックスがどの値であるかを追跡するのに不便な場合があります。
C *-operator
、関数などpValue
、コンテンツを直接逆参照してアクセスするものはありますか?
他の言語では... :
編集:
これが役立つユースケースです:
私はそれがより読みやすいと思います:
それよりも:
そして、前者の方が速いと思います。しかし、値にアクセスしたい場合、「OKタイプは0番」などと覚えておくと不便です...
c++ - CFFIで構造体へのポインタのアドレスを見つけてvoid **にキャストする方法
C ++での私のコードは
そして私の機能は
CFFIは初めてです。だから私の質問は
CFFIで同じことを達成するにはどうすればよいですか?
CFFIの構造体へのポインタ、ポインタのアドレスを見つける方法は?
void**
へのキャストは次の方法で実行できることを知っています
しかし、どうすればそのアドレスを取得して関数に渡すことができますか?
python - C ライブラリを Python CFFI で適切にラップする方法
dbc2dbf.cとblast.cの 2 つの .C ソース ファイルのみを含む非常に単純な C ライブラリをラップしようとしています。
私は次のことを行っています(ドキュメントから):
これはうまくいきません。blast.cを正しくインクルードしていないと思います。
誰でも助けることができますか?
python - pip install -d cffi のホイールを作成しない
Python コードの「オフライン パッケージ」を作成しようとしています。
pip install -d <dest dir> -r requirements.txt
問題は、cffi==1.6.0
(requirements.txt 内で) ホイールに組み込まれないことです。
私はそれを作ることができる方法はありますか?(ターゲットマシンのgccで依存関係を回避しようとしています)
python - CFFI は Python 3.4 と 3.5 の両方で同じ DLL を使用できますか?
このページでは、各 Python バージョンに必要な Microsoft Visual C++ コンパイラのさまざまなバージョンについて説明しています: https://wiki.python.org/moin/WindowsCompilers
Microsoft の代わりに MinGW を使用して 64 ビット Windows 8.1 用の C ライブラリをコンパイルしたいのですが、MinGW-w64/mingwpy は Python 3.5 をサポートしていないことを読みました: Make cffi use MinGW under Python 3.5 on Windows
Windows へのクロス コンパイルについてはhttp://mxe.cc/も参照しますが、これも MinGW-w64 ツールチェーンを使用しています。
Python インターフェイスに CFFI の ABI インライン モードを使用する場合、C ライブラリ用の DLL を 1 回コンパイルして (Microsoft Visual C++ 10.0 との互換性がある)、それを Python 3.4 と 3.5 の両方で使用できますか? その場合、DLL への静的リンクにより、Python 3.5 との互換性が達成されますか? 動的リンクと静的リンクの微妙な点がわかりません。