2014-10-01 141 views
0

我寫了一些python代碼來控制一些USB(電氣繼電器和溫度傳感器)和RS232(真空計)設備。在這個主要腳本中(例如,myscript.py),我想導入一個模塊(例如,exp_protocols.py),其中我定義了不同的實驗協議,即一系列打開或關閉繼電器的指令,讀取溫度和壓力值,流入控制(例如「等到溫度超過200攝氏度」)。從模塊內部訪問全局變量

我最初的嘗試是這樣的:

switch_A = Relay('A') 
switch_B = Relay('B') 
gauge_1 = Gauge('1') 

global switch_A 
global switch_B 
global gauge_1 

from exp_protocols import my_protocol 
my_protocol() 

exp_protocols.py看起來像這樣:

def my_protocol(): 
    print 'Pressure is %.3f mbar.' % gauge_1.value 
    switch_A.close() 
    switch_B.open() 

它輸出一個全局變量錯誤,因爲exp_protocols.my_protocol不能訪問myscript.py定義的對象。

看來,從這裏閱讀答案前面的問題,我可以(應該?)在另一個模塊中創建所有我RelayGauge變量,例如,myconfig.py,然後import myconfig無論是在myscript.pyexp_protocols?但是如果我這樣做,我的RelayGauge對象是不是會創建兩次(因此試圖打開已激活的串行端口等)?

什麼是實現這種模塊間通信的最佳方式(大多數是Pythonic)?

在此先感謝。

+0

爲什麼不會將'switch_A','switch_B'和'gauge_1'作爲函數參數傳遞給'my_protocol'? – 2014-10-01 20:44:20

回答

1

不管你多少次import myconfig,python只導入一次模塊。在第一次導入之後,將來的導入語句只需獲取對該模塊的另一個引用。

僅當這些數據是靜態位時才應使用全局數據。你的功能將是更通用的,如果它採取了變量作爲參數:

def my_protocol(switch_A, switch_B, gauge_1): 
    print 'Pressure is %.3f mbar.' % gauge_1.value 
    switch_A.close() 
    switch_B.open() 

模塊可以與數據的多種組合使用。假設你有開關塊列表(和我只是做這件事,因爲我不知道你如何配置你的數據......),你可以處理它們都具有相同的功能:

import exp_protocols 

switch_blocks = [ 
    [Relay('1-A'), Relay('1-B'), Gauge('1-1')], 
    [Relay('2-A'), Relay('2-B'), Gauge('2-1')], 
] 

for switch1, switch2, gauge in switch_blocks:  
    exp_protocols.my_protocol(switch1, switch2, gauge)