您将应用程序的单独功能保留在不同的模块中是正确的 - 将代码分组在逻辑相关的单元中绝对有意义。但这并不总是微不足道的,它迫使你清楚地考虑这取决于什么,以及关注点的分离。您在这里遇到的称为循环导入。
有两种明显的方法可以解决循环导入:
- 提取由多个模块共享的东西,并将其放入单独的模块中。在你的情况下,
GPIO
包括它的初始化。
- 不要导入在每个模块中共享的东西,而是导入一次并将其作为参数传递给其他需要它的东西。
将其提取到自己的模块中
将初始化提取GPIO
到它自己的模块中可能如下所示:
主文件
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"
模块1.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 一次并作为参数传递可能如下所示:
主文件
# 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)
模块1.py
def Relay(gpio):
print "Relay: %s" % gpio.__name__
# Do stuff with GPIO
在我看来,这两种方法在你的情况下都是有效的。我个人更喜欢在中央gpio.py
模块中进行初始化,然后从那里导入,但这只是个人喜好问题。