0

Python で C ライブラリを呼び出す必要がありますが、検討した結果、CFFI がこの種の作業に最も適しているように思われました。ただし、今では、正しく使用しているかどうか完全に混乱しています。PyPy でのみ意図したとおりに動作するように見えるものもあれば、Python3 (私が知る限り、PyPy はサポートしていません) でのみ動作するように見えるものもあります。 )。

CFFI ドキュメントの最も基本的なコード サンプルを次に示します。

>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef("""
...     int printf(const char *format, ...);   // copy-pasted from the man page
... """)
>>> C = ffi.dlopen(None)                     # loads the entire C namespace
>>> arg = ffi.new("char[]", "world")         # equivalent to C code: char arg[] = "world";
>>> C.printf("hi there, %s.\n", arg)         # call printf
hi there, world.
17                                           # this is the return value
>>>

このコードを Python3 で実行すると、次のエラーが発生します: TypeError: initializer for ctype 'char[]' must be a bytes or list or tuple, not str

エラーを探したところ、PyPy で昨年 1 月に修正された問題として見つかりました。それで、それが PyPy で動作するかどうかを確認します。万歳!

ただし、すでに 2 番目の例では、問題が逆になっています。

# file "simple_example_build.py"

# Note: this particular example fails before version 1.0.2
# because it combines variadic function and ABI level.

from cffi import FFI

ffi = FFI()
ffi.set_source("_simple_example", None)
ffi.cdef("""
    int printf(const char *format, ...);
""")

if __name__ == "__main__":
    ffi.compile()

これを PyPy で実行すると、別のエラーがスローされます。

AttributeError: 'FFI' object has no attribute 'set_source'

この例では、古いバージョンでは動作しないことが有益に示されているため、CFFI バージョンを確認しました: 1.2.1、すべて問題ありません。

最後に、PyPy の代わりに Python3 を使用して 2 番目の例を実行しました。

Python を初めて使用するので、何を使用すればよいのか、同じドキュメントの例が異なるバージョンの言語でしか実行されない理由がわかりません。もちろん、何か間違った設定をしただけかもしれないという問題 (Linux も初めての場合) や、別のバージョンの python を使用する必要があるという問題はまだあります。誰かがこれに光を当てることができますか?

4

2 に答える 2

2

このコードを Python3 で実行すると、次のエラーが発生します: TypeError: initializer for ctype 'char[]' must be a bytes or list or tuple, not str

はい。Python 3 では、バイトを確実に処理するために「b」プレフィックスを使用する必要があるためです。ドキュメントの例では、これをすぐ下に明確に示しています。

AttributeError: 'FFI' オブジェクトには属性 'set_source' がありません

これは、古いバージョンの PyPy を使用していることを意味します。CFFI のバージョンは、特定のバージョンの PyPy ではアップグレードできません。PyPy 自体をアップグレードする必要があります。特定の PyPy に付属している CFFI バージョンを次のように確認します。

$ pypy
Python 2.7.9 (295ee98b6928, May 31 2015, 07:29:04)
[PyPy 2.6.0 with GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> import cffi
>>>> cffi.__version__
'1.1.0'

1.2.1 ではなく、古いバージョンの CFFI が付属している古いバージョンの PyPy を使用していると確信しています。

于 2015-09-16T22:11:24.883 に答える