2008-10-31 78 views
136

在Python中使用DLL文件的最簡單方法是什麼?如何使用Python中的DLL文件?

具體來說,如何做到這一點沒有編寫任何額外的包裝C++代碼來向Python公開功能?

本機Python功能強烈優先於使用第三方庫。

+0

@Remuze你標記錯誤的問題或與標籤錯誤的答案?他們都是蟒蛇,但我沒有看到爲什麼你會發現它們都是類似的(我檢查了修訂歷史記錄以確保它在過去的某個時刻不會更接近) – Foon 2016-04-22 15:37:48

+0

@foon hmmm對不起,我的意思是將另一個問題標爲重複,並將其放在這一個:)我想這表明他們有多相似! – 2016-04-22 16:05:34

回答

113

爲了便於使用,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)) 

的​​東西擁有所有的C型的數據類型(intcharshortvoid*,等等),並且可以通過數值或引用傳遞。它也可以返回特定的數據類型,儘管我的示例沒有這樣做(HLL API通過修改引用傳遞的變量來返回值)。


根據上面顯示的具體示例,IBM的EHLLAPI是一個相當一致的接口。

所有呼叫傳遞四個空指針(EHLLAPI發送返回代碼回通過第四個參數,一個指向int所以,雖然我指定int作爲返回類型,我可以放心地忽略它),按照IBM的文檔here。換句話說,函數的C-變種是:

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

這使得一個單一的,簡單​​功能能夠做任何事情的EHLLAPI庫提供,但很可能是其他圖書館則需要單獨​​功能設置每個庫函數。

WINFUNCTYPE的返回值是一個函數原型,但您仍然需要設置更多參數信息(超出和超過這些類型)。在hllApiParams每個元組具有參數的「方向」(1 =輸入,2 =輸出等),參數名稱和默認值 - 參見​​DOCO對於細節

一旦你的原型和參數信息,您可以創建一個可調用函數的Python「可調用」hllApi。您只需創建所需的變量(在我的情況下爲p1p4),然後使用它們調用該函數。

+0

是的,ctypes很棒。 Python已經有了一個很好的內置(從2.5版本)的方式來訪問DLL中的代碼。 ctypes非常易於使用,因此在編寫實際擴展之前必須考慮三次,而不僅僅是提供一個使用ctypes來連接DLL的純Python模塊。 – 2008-11-01 06:35:45

2

ctypes的會用它使Python中受到碰撞是使用最簡單的事情,但(MIS)。如果你想盡快做點什麼,而且你很小心,那很棒。我會鼓勵你退房Boost Python。是的,它需要你編寫一些C++代碼並擁有一個C++編譯器,但實際上你並不需要學習C++來使用它,並且你可以免費獲得(如啤酒)C++ compiler from Microsoft

45

This page是從DLL文件中調用函數的一個非常簡單的例子。

在Python中調用DLL函數非常簡單。我有一個自制的DLL文件,它有兩個函數:addsub,它們有兩個參數。

add(a, b)返回另外兩個數的
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

3

也許與Dispatch

from win32com.client import Dispatch 

zk = Dispatch("zkemkeeper.ZKEM") 

哪裏zkemkeeper是在系統上註冊的DLL文件... 之後,你可以稱他們訪問功能:

zk.Connect_Net(IP_address, port)