在Python中使用DLL文件的最簡單方法是什麼?如何使用Python中的DLL文件?
具體來說,如何做到這一點沒有編寫任何額外的包裝C++代碼來向Python公開功能?
本機Python功能強烈優先於使用第三方庫。
在Python中使用DLL文件的最簡單方法是什麼?如何使用Python中的DLL文件?
具體來說,如何做到這一點沒有編寫任何額外的包裝C++代碼來向Python公開功能?
本機Python功能強烈優先於使用第三方庫。
爲了便於使用,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型的數據類型(int
,char
,short
,void*
,等等),並且可以通過數值或引用傳遞。它也可以返回特定的數據類型,儘管我的示例沒有這樣做(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
。您只需創建所需的變量(在我的情況下爲p1
到p4
),然後使用它們調用該函數。
是的,ctypes很棒。 Python已經有了一個很好的內置(從2.5版本)的方式來訪問DLL中的代碼。 ctypes非常易於使用,因此在編寫實際擴展之前必須考慮三次,而不僅僅是提供一個使用ctypes來連接DLL的純Python模塊。 – 2008-11-01 06:35:45
ctypes的可以用來訪問的dll,這裏有一個教程:
ctypes的會用它使Python中受到碰撞是使用最簡單的事情,但(MIS)。如果你想盡快做點什麼,而且你很小心,那很棒。我會鼓勵你退房Boost Python。是的,它需要你編寫一些C++代碼並擁有一個C++編譯器,但實際上你並不需要學習C++來使用它,並且你可以免費獲得(如啤酒)C++ compiler from Microsoft。
This page是從DLL文件中調用函數的一個非常簡單的例子。
在Python中調用DLL函數非常簡單。我有一個自制的DLL文件,它有兩個函數:
add
和sub
,它們有兩個參數。
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
也許與Dispatch
:
from win32com.client import Dispatch
zk = Dispatch("zkemkeeper.ZKEM")
哪裏zkemkeeper是在系統上註冊的DLL文件... 之後,你可以稱他們訪問功能:
zk.Connect_Net(IP_address, port)
@Remuze你標記錯誤的問題或與標籤錯誤的答案?他們都是蟒蛇,但我沒有看到爲什麼你會發現它們都是類似的(我檢查了修訂歷史記錄以確保它在過去的某個時刻不會更接近) – Foon 2016-04-22 15:37:48
@foon hmmm對不起,我的意思是將另一個問題標爲重複,並將其放在這一個:)我想這表明他們有多相似! – 2016-04-22 16:05:34