Python: как использовать переменные между модулями
Я пытаюсь выяснить, как использовать переменные и настроек всех модулей.
Я прав, когда думаю, что разумно хранить отдельные функции программы в отдельных модулях?
у меня есть основной модуль программы 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 на работу. Как мне с этим справиться?
Я действительно не хочу GPIO
настройки части в module1
, Я не хочу, чтобы он запускался каждый раз, когда я запускаю module1.Relay(1,1)
звонок..
какова наилучшая практика работы с модулями? (Я делаю контроллер для тепловой системы моего дома.)
2 ответов
вы правы относительно сохранения отдельных функций вашего приложения в разных модулях - абсолютно имеет смысл группировать ваш код в логически связанных единицах. Это не всегда тривиально, хотя и заставляет вас ясно думать о том, что зависит от того, что и разделение проблем. То, с чем вы здесь столкнулись, называется круговой импорта.
есть два очевидных способа решить circular импорт:
-
экстракт вещь, которая совместно используется более чем одним модулем, и поместить его в отдельный модуль. В вашем случае это
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 в глобальной области gpio.py
модуль запускается только один раз, в первый раз модуль импортируется в любом месте.
передав в качестве аргумент
другой вариант, импорт 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)