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 を使用する必要があるという問題はまだあります。誰かがこれに光を当てることができますか?