2013-12-10 33 views
0

我正在使用python 2.7.2。關於DLL函數的導入錯誤

我使用的DLL與外部硬件交談,通過使用下面的臺詞:

main.py

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

ret_val需要在所有其他DLL函數,因爲幾個硬件相同類型可以連接到同一臺PC上
comm_dll需要在需要訪問這個DLL函數的幾個模塊中

我的問題是如何使其他模塊知道comm_dllret_val變量
我嘗試通過import from main comm_dll,ret_val或使用兩個變量global關鍵字從主導入它們,然後將它們導入
不管我做什麼,其他模塊失敗的import語句

我知道我可以通過這些變量的所有功能使用它們,但它似乎大開銷

什麼是Python的方式做這樣的進口?

注意:RET_VAL類型是ctypes.c_int

CODE

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) 

我得到的使用from main import comm_dllNameError: global name 'comm_dll' is not defined

的錯誤是工作不要麼因爲主再次運行...

回答

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 
+0

我需要連接到硬件只有一次,在一個模塊中,然後用幾個模塊的'ret_val',他們每個人的使用DLL中的其他功能(用於SPI功能的模塊,用於I2C功能的模塊...) –

+0

將此設備封裝在類似的類中仍然不失爲一個好主意。無論如何,你能向我們展示你已經寫過的模塊,以及你嘗試使用它時遇到的錯誤嗎? – bdesham

+0

我在代碼中添加了部分代碼 –