Как импортировать значения переменных из запущенного файла?

#python-3.x

#python-3.x

Вопрос:

Я запускаю файл Python, скажем file1, и в нем я импортирую другой файл python, скажем file2, и вызываю одну из его функций. Теперь файлу 2 требуется значение переменной, которая определена в файле 1. Кроме того, перед импортом file2 в file1 значение переменной было изменено во время выполнения. Как мне создать файл file2 , получить доступ к текущему значению переменной из файла 1?

Содержимое file1 является:

 variable = None

if __name__ == '__main__':
    variable = 123
    from file2 import func1
    func1()
  

Содержимое file2 является:

 from file1 import variable as var

def func1():
    print(var)
  

Когда я запускаю файл1, я хочу, чтобы функция func1 в file2 выводила 123. Но он печатает None . Один из способов, которым я могу решить эту проблему, — сохранить содержимое переменной в каком-нибудь обычном файле, когда он изменен, а затем извлечь его при необходимости. Но приложение, в котором я использую этот код, имеет огромный размер переменной, примерно 300 МБ. Поэтому я считаю, что будет недостаточно эффективно записывать содержимое переменной в текстовый файл каждый раз, когда он изменяется. Как мне это сделать? (Любые предложения приветствуются)

Комментарии:

1. Почему бы вам просто не передать var в качестве параметра?

2. @MisterMiyagi Это определенно решило бы мою проблему. Но просто интересно, как получить доступ к значениям переменных во время выполнения в каком-то другом файле.

Ответ №1:

Основной скрипт запускается с именем __main__ , а не по имени его модуля. Так же работает if __name__ == '__main__' проверка. Импортируя его по обычному имени, создается отдельный модуль с обычным содержимым.

Если вы хотите получить доступ к его атрибутам, импортируйте его как __main__ :

 from __main__ import variable as var

def func1():
    print(var)
  

Обратите внимание, что импорт __main__ является хрупким. Помимо дублирования модуля, вы можете импортировать другой модуль, если структура вашей программы изменится. Если вы хотите обмениваться глобальными данными, используйте четко определенные имена модулей:

 # constants.py
variable = None

# file1.py
if __name__ == '__main__':
    import constants
    constants.variable = 123
    from file2 import func1
    func1()

# file2.py
from constants import variable as var

def func1():
    print(var)
  

Обязательный отказ от ответственности: в идеале функции не полагаются на глобальные переменные. Используйте параметры для передачи переменных в функции:

 # constants.py
variable = None

# file1.py
if __name__ == '__main__':
    from file2 import func1
    func1(123)

# file2.py
from constants import variable

def func1(var=variable):
   print(var)
  

Комментарии:

1. Это здорово. Использование __main__ несколько усложняет ситуацию. Пакет constants отлично подходит для обмена глобальными данными. Спасибо за ваш вклад. Я проверю больше о constants пакете, чтобы увидеть, какие другие функции он предоставляет.

2. @VighneshRaut constants — это просто имя, которое я придумал. Просто выберите имя, уникальное для вашего пакета / среды, и создайте модуль только с переменными внутри.