1. ホーム
  2. パイソン

[解決済み】PythonからDLLファイルを使用するにはどうすればよいですか?

2022-05-02 19:27:03

質問

を使用する最も簡単な方法は何ですか? DLL ファイルから Python ?

具体的には、どのようにすればよいのでしょうか なく 追加のラッパーを書く C++ に機能を公開するためのコードです。 Python ?

ネイティブ Python の機能は、サードパーティライブラリを使用するよりも強く推奨されます。

どのように解決するのですか?

使い勝手をよくするために タイプ がおすすめです。

以下のctypeの例は、私が実際に書いたコード(Python2.5)から引用したものです。 これは、あなたが尋ねたことを行うために、私が見つけた最も簡単な方法でした。

import ctypes

# Load DLL into memory.

hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")

# Set up prototype and parameters for the desired function call.
# HLLAPI

hllApiProto = ctypes.WINFUNCTYPE (
    ctypes.c_int,      # Return type.
    ctypes.c_void_p,   # Parameters 1 ...
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.c_void_p)   # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),

# Actually map the call ("HLLAPI(...)") to a Python name.

hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)

# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.

p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))

ctypes のものは、すべてのC型データ型( int , char , short , void* というように)、値や参照で渡すことができます。 また、特定のデータ型を返すこともできますが、私の例ではそのようなことはしていません(HLL APIは、参照渡しされた変数を変更して値を返します)。


上に示した具体例で言えば、IBMのEHLLAPIはかなり一貫性のあるインターフェイスです。

すべての呼び出しは、4つのボイドポインタを渡します(EHLLAPIは、4番目のパラメータである int ということで、指定しながら int を返り値として指定しても、それを無視しても大丈夫です) IBMのドキュメントにあるように ここで . つまり、この関数のC言語バージョンは次のようになります。

int hllApi (void *p1, void *p2, void *p3, void *p4)

これにより、単一のシンプルな ctypes 関数は、EHLLAPI ライブラリが提供するあらゆることを行うことができますが、他のライブラリでは、別の ctypes 関数がライブラリ関数ごとに設定されます。

からの戻り値は WINFUNCTYPE は関数プロトタイプですが、さらにパラメータ情報を(型を超えて)設定する必要があります。の各タプルは hllApiParams はパラメータ "方向" (1 = 入力、2 = 出力、など)、パラメータ名、デフォルト値を持っています。 ctypes 詳細はこちら

プロトタイプとパラメータの情報が得られたら、Pythonの"callable"を作成することができます。 hllApi で、その関数を呼び出すことができます。単に必要な変数( p1 を通して p4 を作成し、それを使って関数を呼び出します。