如何使用Python中的DLL文件?

2024-04-27 05:10:06 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中使用DLL文件最简单的方法是什么?

具体地说,如果不编写任何额外的包装器C++代码来将功能公开给Python,如何做到这一点?

与使用第三方库相比,强烈建议使用本机Python功能。


Tags: 文件方法代码功能dll
3条回答

ctypes可用于访问dll,下面是一个教程:

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

为了便于使用,ctypes是一条路。

下面的ctypes示例来自我编写的实际代码(Python2.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))

ctypes类具有所有C类型的数据类型(intcharshortvoid*,等等),并且可以按值或引用传递。它还可以返回特定的数据类型,尽管我的示例没有这样做(HLL API通过修改通过引用传递的变量返回值)。


就上面显示的特定示例而言,IBM的EHLLAPI是一个相当一致的接口。

所有调用都传递四个空指针(EHLLAPI通过第四个参数发送返回代码,一个指向int的指针,因此,当我指定int作为返回类型时,我可以安全地忽略它),如IBM的文档here所示。换言之,函数的C变量是:

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

这使得一个简单的ctypes函数能够执行EHLLAPI库提供的任何操作,但是其他库可能需要为每个库函数设置一个单独的ctypes函数。

来自WINFUNCTYPE的返回值是一个函数原型,但是您仍然需要设置更多的参数信息(除了类型之外)。hllApiParams中的每个元组都有一个参数“direction”(1=input,2=output等等),一个参数名和一个默认值-有关详细信息,请参见ctypes文档

一旦获得了原型和参数信息,就可以创建一个Python“可调用的”hllApi来调用函数。您只需创建所需的变量(p1p4,在我的例子中)并用它们调用函数。

This page有一个从DLL文件调用函数的非常简单的例子。

为了完整起见,请重新表述以下细节:

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

相关问题 更多 >