[英]Python: How to use variables across modules
我正在试图弄清楚如何在模块中使用变量和设置。
当我认为将程序的单独功能保存在单独的模块中时,我是否正确?
我有一个名为main.py
主程序模块,其中包含:
# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
Print("Error importing RPi.GPIO!!")
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# GPIO16 is relay1
GPIO.setup(16, GPIO.OUT, initial=GPIO.HIGH)
# GPIO11 is relay2
GPIO.setup(11, GPIO.OUT, initial=GPIO.HIGH)
然后我import
一个模块(在该模块中我有一个名为Relay
的函数)并尝试将该函数与module1.Relay(1,1)
但在功能module1
所需要的GPIO
从main.py工作。 我该如何解决这个问题? 我真的不希望module1
的GPIO
设置部分,我不希望每次运行module1.Relay(1,1)
调用时都运行它。
跨模块工作的最佳实践是什么? (我正在为我家的供暖系统制作一个控制器。)
您正确地将应用程序的不同功能保存在不同的模块中 - 将逻辑相关单元中的代码分组是绝对有意义的。 然而,这并不总是微不足道的,并且迫使你清楚地思考这取决于什么和关注点的分离。 你在这里遇到的是一个循环导入 。
解决循环导入有两种明显的方法:
GPIO
包括其初始化。 将GPIO
初始化提取到它自己的模块中可能如下所示:
main.py
from gpio import GPIO
import module1
print "main: %s" % GPIO.__name__
# Do stuff wth GPIO
module1.Relay()
gpio.py
# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO!!")
print "Setting up GPIO"
GPIO.state = 'initialized'
print "Done setting up"
module1.py
from gpio import GPIO
def Relay():
print "Relay: %s" % GPIO.__name__
# Do stuff with GPIO
运行main.py
时的输出:
Setting up GPIO
Done setting up
main: RPi.GPIO
Relay: RPi.GPIO
如您所见, gpio.py
模块全局范围内的GPIO初始化仅运行一次,第一次将模块导入任何位置。
另一个选项,导入GPIO一次并作为参数传递可能如下所示:
main.py
# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO!!")
print "Setting up GPIO"
GPIO.state = 'initialized'
print "Done setting up"
import module1
print "main: %s" % GPIO.__name__
# Do stuff wth GPIO
module1.Relay(GPIO)
module1.py
def Relay(gpio):
print "Relay: %s" % gpio.__name__
# Do stuff with GPIO
在我看来,这两种方式都适用于您的情况。 我个人更喜欢在中央gpio.py
模块中进行初始化,然后从那里导入,但这只是一个品味问题。
从理论上讲,从其他模块导入GPIO应该没问题。 例如,检查此示例:
gpio.py
# Dummy GPIO module
some_value = 5
def set_value(new_value):
global some_value
some_value = new_value
def get_value():
return some_value
module1.py
import gpio
def Relay(a, b):
print "module1.Relay:", gpio.get_value()
main.py
import gpio
gpio.set_value(1337)
import module1
module1.Relay(1,1) # Prints the new value (1337)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.