我写了一些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
中定义的对象。
从阅读此处早期问题的答案看来,我可以(应该?)在另一个模块中创建我的所有Relay
和Gauge
变量,例如myconfig.py
,然后在import myconfig
和myscript.py
中exp_protocols
?但是,如果我这样做,我的Relay
和Gauge
对象不会被创建两次(因此尝试打开已经激活的串口等)?
实现这种模块间通信的最佳(最Pythonic)方式是什么?
提前致谢。
答案 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)