从模块内部访问全局变量

时间:2014-10-01 20:42:29

标签: python

我写了一些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 myconfigmyscript.pyexp_protocols?但是,如果我这样做,我的RelayGauge对象不会被创建两次(因此尝试打开已经激活的串口等)?

实现这种模块间通信的最佳(最Pythonic)方式是什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

无论你import myconfig多少次,python只导入一次模块。在第一次导入之后,将来的import语句只会获取对该模块的另一个引用。

只有在这些是静态数据位时才应使用全局变量。如果将变量作为参数,则函数将更通用:

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)