我正在试图弄清楚如何在模块中使用变量和设置。
当我认为将程序的单独功能保存在单独的模块中时,我是否正确?
我有一个名为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
中的函数需要main.py中的GPIO
才能工作。我该如何解决这个问题?
我真的不希望GPIO
中的module1
设置部分,我不希望每次运行module1.Relay(1,1)
调用时都会运行它。
跨模块工作的最佳做法是什么? (我正在为我家的供暖系统制作一个控制器。)
答案 0 :(得分:3)
您正确地将应用程序的不同功能保存在不同的模块中 - 将逻辑相关单元中的代码分组是绝对有意义的。然而,这并不总是微不足道的,并且迫使你清楚地思考这取决于什么和关注点的分离。您在此处遇到的内容称为循环导入。
解决循环导入有两种明显的方法:
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
模块中进行初始化,然后从那里导入,但这只是一个品味问题。
答案 1 :(得分:1)
从理论上讲,从其他模块导入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)