2014-10-01 70 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)