我正在使用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_dll
和ret_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
无法正常工作,因为要再次运行...
答案 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