关于DLL函数的导入错误

时间:2013-12-10 16:55:20

标签: python

我正在使用python 2.7.2。

我正在使用DLL与外部硬件通信,使用以下行:

main.py

comm_dll = ctypes.cdll.LoadLibrary("extcomm.dll")  
ret_val =  comm_dll.open(0)

所有其他DLL函数都需要ret_val,因为同一类型的多个硬件可以连接到同一台PC上 需要访问此DLL函数的几个模块中需要comm_dll

我的问题是如何让其他模块知道comm_dllret_val变量
我尝试通过import from main comm_dll,ret_val或在两个变量上使用global关键字从main导入它们,然后导入它们 无论我做什么,导入语句中的其他模块都失败了

我知道我可以将这些变量传递给使用它们的所有函数,但它似乎很有开销

进行此类导入的pythonic方式是什么?

注意:ret_val类型为ctypes.c_int

代码

main.py

import ctypes  
from drv_spi import  *

def main():

    comm_dll = ctypes.cdll.LoadLibrary("extcomm.dll")

    comm_dll.open.argtypes = [ctypes.c_int]
    comm_dll.open.restypes = ctypes.c_int

    comm_handle =  comm_dll.open(0)

    drv_spi_init()  
main()

drv_spi.py

import ctypes

def drv_spi_init():

    comm_dll.spi_config.argtypes = [ctypes.c_int, ctypes.c_int]
    comm_dll.spi_config.restypes = ctypes.c_int

    ret_val = comm_dll.spi_config(comm_handle,0x45)

我收到NameError: global name 'comm_dll' is not defined

的错误

使用from main import comm_dll无法正常工作,因为要再次运行...

1 个答案:

答案 0 :(得分:0)

听起来你应该把你的硬件设备作为一个类来实现。像

这样的东西
class MyHardwareDevice(object):
    comm_dll = ctypes.cdll.LoadLibrary("extcomm.dll")

    def __init__(self):
        pass      # or whatever initialization you need

    def connect(self, port_number):
        self.ret_val = comm_dll.open(port_number)

然后你可以使用像

这样的类
device = MyHardwareDevice()
device.connect(0)
# your ret_val is now available as device.ret_val