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)