問題タブ [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.

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

python - Python CFFI - フォーマットされた Python 文字列を関数呼び出しでバイト配列として使用できない

かなり面倒な Microchip デバイス用の API を持っているので、コードCをインクルードするさまざまな方法を学んでいます。これにより、テストをはるかに高速に行うことができます。それを行う1つの方法は、基本的にコンパイラーを呼び出して、提供されたものが正しいかどうかをチェックすることをユーザーに提供するモジュールを使用することです。PythonPythoncffiverify()Ccdef(...)

最初に適切に使用する方法を学ぶことができるように、小さなプロジェクトを作成しましたcffi。2つの部分で構成されています

  1. ライブラリ- C で書かれています。私はそれに応じてそのコードをコンパイルするために使用cmakemakeます。

    CMakeLists.txt

    testcffi.h

    testcffi.c

    /li>
  2. Python でのテスト コードstruct- コードは、上記のライブラリの 3 つの関数と共にの使用法を示しています。

    /li>

Python問題は、コード内のそれぞれの場所にデータを渡すために文字列を変換する必要があるバイト配列に起因しCます。

上記のコードは機能していますが、 に似た他の文字列を使用したいと思いますb'hello'。そのため、format()(短い形式の とともに%) inを使用Pythonして、一連の文字と数字を組み合わせようとしましたが、. うまくいきませんでした。my のパラメーターの""値として取得するか、奇妙な交互のガベージ データ (文字でも数字でもないほとんどの奇妙な文字) を取得します。labelpoint_t struct

encode()関数を間違って使用していると思いましたが、Pythonインタラクティブシェル内でテストしたところ、 を使用した場合と同じ出力が得られましたb'...'

ここで何が起こっているのか分かりますか?


知っておくと便利な質問:これまで読んだことからcffi、ガベージ コレクションを使用してPython、C コードで動的に割り当てられたメモリの割り当てを解除しているようです。たくさんのポイントでテストしましたが、これが実際に常に当てはまることを確認したいと思います。


更新: わかりました。new(...)動作しないように見えますが、その場合、すべての値はループ内の最後の値と同じです。たとえば、ループが 10 に達すると、すべてのstructPython オブジェクトのラベルに 10 が含まれます。これは参照の問題のようです。使用するnew(...)と、ガベージデータが取得されます。

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

python - Python CFFI で ffi.addressof で作成されたポインターを逆参照する (C *-operator と同等ですか?)

Python CFFI では、上記のコードはvaluesasの最初の要素へのポインターを作成しますpValue

その後、 でそのコンテンツにアクセスできますがvalues[ 0 ]、これは実際には透過的ではなく、どのインデックスがどの値であるかを追跡するのに不便な場合があります。

C *-operator、関数などpValue、コンテンツを直接逆参照してアクセスするものはありますか?

他の言語では... :

編集:
これが役立つユースケースです:

私はそれがより読みやすいと思います:

それよりも:

そして、前者の方が速いと思います。しかし、値にアクセスしたい場合、「OKタイプは0番」などと覚えておくと不便です...

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

c++ - CFFIで構造体へのポインタのアドレスを見つけてvoid **にキャストする方法

C ++での私のコードは

そして私の機能は

CFFIは初めてです。だから私の質問は

  1. CFFIで同じことを達成するにはどうすればよいですか?

  2. CFFIの構造体へのポインタ、ポインタのアドレスを見つける方法は?

void**へのキャストは次の方法で実行できることを知っています

しかし、どうすればそのアドレスを取得して関数に渡すことができますか?

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

python - C ライブラリを Python CFFI で適切にラップする方法

dbc2dbf.cblast.cの 2 つの .C ソース ファイルのみを含む非常に単純な C ライブラリをラップしようとしています。

私は次のことを行っています(ドキュメントから):

これはうまくいきません。blast.cを正しくインクルードしていないと思います。

誰でも助けることができますか?

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

python - pip install -d cffi のホイールを作成しない

Python コードの「オフライン パッケージ」を作成しようとしています。

pip install -d <dest dir> -r requirements.txt 問題は、cffi==1.6.0(requirements.txt 内で) ホイールに組み込まれないことです。

私はそれを作ることができる方法はありますか?(ターゲットマシンのgccで依存関係を回避しようとしています)

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

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 との互換性が達成されますか? 動的リンクと静的リンクの微妙な点がわかりません。