What is the easiest way to use a DLL file from within Python?
Specifically, how can this be done without writing any additional wrapper C++ code to expose the functionality to Python?
Native Python functionality is strongly preferred over using a third-party library.
For ease of use, ctypes is the way to go.
The following example of ctypes is from actual code I\'ve written (in Python 2.5). This has been, by far, the easiest way I\'ve found for doing what you ask.
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))
The ctypes
stuff has all the C-type data types (int
, char
, short
, void*
, and so on) and can pass by value or reference. It can also return specific data types although my example doesn\'t do that (the HLL API returns values by modifying a variable passed by reference).
In terms of the specific example shown above, IBM\'s EHLLAPI is a fairly consistent interface.
All calls pass four void pointers (EHLLAPI sends the return code back through the fourth parameter, a pointer to an int
so, while I specify int
as the return type, I can safely ignore it) as per IBM\'s documentation here. In other words, the C variant of the function would be:
int hllApi (void *p1, void *p2, void *p3, void *p4)
This makes for a single, simple ctypes
function able to do anything the EHLLAPI library provides, but it\'s likely that other libraries will need a separate ctypes
function set up per library function.
The return value from WINFUNCTYPE
is a function prototype but you still have to set up more parameter information (over and above the types). Each tuple in hllApiParams
has a parameter \"direction\" (1 = input, 2 = output and so on), a parameter name and a default value - see the ctypes
doco for details
Once you have the prototype and parameter information, you can create a Python \"callable\" hllApi
with which to call the function. You simply create the needed variable (p1
through p4
in my case) and call the function with them.
This page has a very simple example of calling functions from a DLL file.
Paraphrasing the details here for completeness:
It\'s very easy to call a DLL function in Python. I have a self-made DLL file with two functions: add
and sub
which take two arguments.
add(a, b)
returns addition of two numbers
sub(a, b)
returns substraction of two numbers
The name of the DLL file will be \"demo.dll\"
Program:
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
Output:
Addition value:11
Substraction:9
ctypes can be used to access dlls, here\'s a tutorial:
http://docs.python.org/library/ctypes.html#module-ctypes
Maybe with Dispatch
:
from win32com.client import Dispatch
zk = Dispatch(\"zkemkeeper.ZKEM\")
Where zkemkeeper is a registered DLL file on the system...
After that, you can access functions just by calling them:
zk.Connect_Net(IP_address, port)
ctypes will be the easiest thing to use but (mis)using it makes Python subject to crashing. If you are trying to do something quickly, and you are careful, it\'s great.
I would encourage you to check out Boost Python. Yes, it requires that you write some C++ code and have a C++ compiler, but you don\'t actually need to learn C++ to use it, and you can get a free (as in beer) C++ compiler from Microsoft.