Как разделить глобальную переменную между файлами в python? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь найти способ поделиться переменной между несколькими python скриптами. У меня есть следующий код:

b.py

my_variable = []

a.py

from b import my_variable  # import the value
def run():
       global x
       x = my_variable.append("and another string")
       print(my_variable)
if __name__ == '__main__':
       run()

c .py

import a
print(a.x)

a.py работает нормально, без каких-либо ошибок. Однако, когда я запускаю файл c .py , он выдает следующую ошибку:

Traceback (most recent call last):
File "E:/MOmarFarooq/Programming/Projects/Python Projects/Variables across files/c.py", line 2, in 
<module>
print(a.x)
AttributeError: module 'a' has no attribute 'x'

Я хочу, чтобы код выполнял вывод нового значения my_variable после того, как он был изменен в a.py . Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 07 августа 2020

ошибка произошла из-за того, что вы никогда не вызывали функцию запуска из a.py. Оператор if __name__=='__main__': выполняется, только если вы запускаете a.py как программу, а не импортируете его как модуль. Таким образом, a.py должен быть

from b import my_variable  # import the value
def run():
       global x
       x = my_variable.append("and another string")
       print(my_variable)
run()

Обратите внимание, что x будет установлен в None, потому что функция добавления ничего не возвращает. Он просто добавляет значение в список.

0 голосов
/ 07 августа 2020

Вам необходимо вызвать функцию run() в вашем c .py файле. Вот каким должен быть код:

import a
a.run()
0 голосов
/ 07 августа 2020

Ну, модуль 'a' не имеет атрибута 'x'. В модуле 'a' есть функция, которая создает переменную 'x', но пока метод не вызывается, атрибут отсутствует.

Вы можете изменить файл c.py на:

import a
a.run()
print(a.x)

Другое решение - убедиться, что функция run() всегда вызывается при импорте модуля 'a'. В настоящее время это не так, из-за строки if __name__ == '__main__':.

Если вы не хотите запускать код, а только хотите убедиться, что переменная существует, просто определите ее в модуле. Перед определением вашего метода run() просто добавьте x = None (или используйте любое другое начальное значение, которое вы предпочитаете).

Обратите внимание, однако, что есть другие проблемы с вашим кодом и с использованием глобальных переменных таким образом это действительно плохой шаблон программирования, который, вероятно, приведет к другим проблемам позже. Интересно, чего вы хотите достичь. Вероятно, было бы лучшим решением, если бы вы могли передать x в качестве аргумента функции run() вместо ссылки на глобальную переменную. Но это выходит за рамки этого вопроса, и на него сложно ответить без дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...