[英]Calling a DLL function from Python
我想從Python調用DLL內的函數。 但我收到此錯誤:
"Attribute Error function not found"
這是我的代碼:
import os
import ctypes
os.chdir("C:\\Program Files\\Compact Automated Testing System V2.0")
# Load DLL into memory.
CATSDll = ctypes.WinDLL ("CATS.dll")
# Set up prototype and parameters for the desired function call.
CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8,ctypes.c_double)
CATSDllApiParams = (1, "p1", 0), (1, "p2", 0),
# Actually map the call (setDACValue) to a Python name.
CATSDllApi = CATSDllApiProto (("setDACValue", CATSDll), CATSDllApiParams)
# Set up the variables and call the Python name with them.
p1 = ctypes.c_uint8 (1)
p2 = ctypes.c_double (4)
CATSDllApi(p1,p2)
但是DLL文檔顯示了帶有ChannelId
和DAC Voltage
作為輸入的setDACValue
函數。
上面是基於StackOverflow可用的一段代碼。
我還嘗試了使用cdll.LoadLibrary的簡單方法,然后調用該函數,但這也會產生相同的錯誤。
誰能建議我哪里錯了? 謝謝。
完整回溯:
Traceback (most recent call last):
File "C:\Users\AEC_FULL\Softwares\eclipse\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydevd.py", line 2235, in <module>
globals = debugger.run(setup['file'], None, None)
File "C:\Users\AEC_FULL\Softwares\eclipse\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydevd.py", line 1661, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:\Users\AEC_FULL\Saravanan\Workspace\CATS\CATS.py", line 18, in <module>
CATSDllApi = CATSDllApiProto (("setDACValue", CATSDll), CATSDllApiParams)
AttributeError: function 'setDACValue' not found
當指定函數原型時,不僅應指定參數的類型,還應指定返回類型作為WINFUNCTYPE的第一個arg。 因此,線
CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8,ctypes.c_double)
應該替換為
CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8, ctypes.c_uint8,ctypes.c_double)
嘗試這個。 您可能需要使用WinDLL
,但是CDLL
更有可能:
from ctypes import *
cats = CDLL('CATS')
cats.setDACValue.argtypes = [c_uint8,c_double]
cats.setDACValue.restype = c_uint8
cats.setDACValue(1,4)
如果仍然找不到setDACValue
,則可以使用Microsoft工具dumpbin
在DLL中列出導出的函數名稱:
dumpbin /exports CATS.dll
它隨Visual Studio一起安裝在安裝目錄下的VC \\ bin目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.