繁体   English   中英

Python:如何跨模块使用变量

[英]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工作。 我该如何解决这个问题? 我真的不希望module1GPIO设置部分,我不希望每次运行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM