209

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

具体的には、機能を公開するための追加のラッパーコードを記述せずに、これをどのように実行できますか?C++Python

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

4

7 に答える 7

171

使いやすさのために、ctypesは行く方法です。

次のctypesの例は、私が(Python 2.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))

ものにはすべてのctypesCタイプのデータ型(、、、、intなど)がありchar、値または参照を渡すことができます。私の例ではそうしていませんが、特定のデータ型を返すこともできます(HLL APIは、参照によって渡された変数を変更することによって値を返します)。shortvoid*


上記の特定の例に関して、IBMのEHLLAPIはかなり一貫性のあるインターフェースです。

IBMのドキュメントにあるように、すべての呼び出しは4つのvoidポインターを渡します(EHLLAPIは4番目のパラメーターを介して戻りコードを送り返します。これはintsoへのポインターです。戻りタイプとして指定intますが、無視しても問題ありません)。言い換えると、関数のCバリアントは次のようになります。

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

ctypesこれにより、EHLLAPIライブラリが提供するすべてのことを実行できる単一の単純な関数が作成されますが、他のライブラリでは、ctypesライブラリ関数ごとに個別の関数を設定する必要がある可能性があります。

からの戻り値WINFUNCTYPEは関数プロトタイプですが、それでも(タイプに加えて)より多くのパラメーター情報を設定する必要があります。の各タプルにhllApiParamsは、パラメーター「方向」(1 =入力、2 =出力など)、パラメーター名、およびデフォルト値があります。詳細については、ctypesドキュメントを参照してください。

プロトタイプとパラメータの情報を入手したらhllApi、関数を呼び出すためのPython「呼び出し可能」を作成できます。必要な変数を作成し(私の場合はp1スルーp4)、それらを使用して関数を呼び出すだけです。

于 2008-10-31T02:43:41.100 に答える
79

このページには、DLL ファイルから関数を呼び出す非常に簡単な例があります。

完全を期すために、ここで詳細を言い換えます。

Python で DLL 関数を呼び出すのは非常に簡単です。私は 2 つの関数を持つ自作の DLL ファイルを持っています:addsub2 つの引数を取ります。

add(a, b)2 つの数値の加算を返します 2 つの数値
sub(a, b)の減算を返します

DLL ファイルの名前は「demo.dll」になります。

プログラム:

from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2

出力:

Addition value:11
Substraction:9

于 2010-07-04T06:28:31.080 に答える
6

ctypes を使用して dll にアクセスできます。チュートリアルは次のとおりです。

http://docs.python.org/library/ctypes.html#module-ctypes

于 2008-10-31T02:18:03.087 に答える
6

たぶんDispatch

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

zkemkeeper はシステムに登録されている DLL ファイルです...その後、関数を呼び出すだけで関数にアクセスできます。

zk.Connect_Net(IP_address, port)
于 2013-06-17T21:38:07.637 に答える
3

ctypes は最も簡単に使用できますが、(誤って) 使用すると Python がクラッシュする可能性があります。あなたが何かを素早くやろうとしていて、注意を払っているなら、それは素晴らしいことです.

Boost Pythonをチェックすることをお勧めします。はい、いくつかの C++ コードを記述し、C++ コンパイラを使用する必要がありますが、実際にそれを使用するために C++ を学習する必要はなく、Microsoft から無料の (ビールのように) C++ コンパイラを入手できます。

于 2008-10-31T02:24:51.967 に答える