6

我试图弄清楚如何跨模块使用变量和设置。

当我认为将程序的单独功能保存在单独的模块中很聪明时,我是对的吗?

我有一个名为的主程序模块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 到 Work。我该怎么做?我真的不希望GPIO设置部分module1,我不希望每次运行module1.Relay(1,1)呼叫时都运行它。

跨模块工作的最佳实践是什么?(我正在为我家的供暖系统制作控制器。)

4

2 回答 2

3

您将应用程序的单独功能保留在不同的模块中是正确的 - 将代码分组在逻辑相关的单元中绝对有意义。但这并不总是微不足道的,它迫使你清楚地考虑这取决于什么,以及关注点的分离。您在这里遇到的称为循环导入

有两种明显的方法可以解决循环导入:

  • 提取由多个模块共享的东西,并将其放入单独的模块中。在你的情况下,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模块中进行初始化,然后从那里导入,但这只是个人喜好问题。

于 2013-11-02T22:53:11.287 回答
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

模块1.py

import gpio

def Relay(a, b):
    print "module1.Relay:", gpio.get_value()

主文件

import gpio

gpio.set_value(1337)

import module1

module1.Relay(1,1) # Prints the new value (1337)
于 2013-11-02T23:00:23.947 回答