[解決済み】PythonからDLLファイルを使用するにはどうすればよいですか?
質問
を使用する最も簡単な方法は何ですか?
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
を作成し、それを使って関数を呼び出します。
関連
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python関数の高度な応用を解説
-
Python カメの描画コマンドとその例
-
Python jiabaライブラリの使用方法について説明
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない