#python #import #python-import
Вопрос:
Итак, есть два сценария: script1.py
и script2.py
. script1.py
имеет переменную x
, в которой хранится строка, считанная из файла во время выполнения. В script2.py
, я импортирую script1.py
, а затем запускаю script1.py
, используя следующее: script1.main()
. Затем я запускаю определенную функцию, script1.py
которая отвечает за чтение рассматриваемого файла.
Вы можете задаться вопросом, почему я просто не запускаю эту конкретную функцию в первую очередь, вместо того, чтобы запускать весь сценарий целиком. Это потому script1.py
, что делает кучу других вещей, которые script2.py
нужны каждый раз, когда он запускается.
Я хочу иметь возможность читать то, что хранится, x
когда script1.py
запускается script2.py
. То, что я сейчас делаю, по сути, является частью script1.py
дважды. Я хочу знать, можно ли получить доступ к переменной x
, не выполняя следующих действий:
#script1
def read_file():
f = open('file_path.txt')
string = f.read()
return string
def main():
x = read_file()
if __name__ == '__main__':
main()
И script2.py
:
#script2
import script1
from script1 import *
def main():
script1.main()
x = read_file()
print(x)
if __name__ == '__main__':
main()
Поэтому, по сути, я хочу знать, как обычно предполагается делать подобные вещи. Можно ли получить значение x
без необходимости запускать read_file()
второй раз? Когда script1.main()
выполняется, где хранится значение x
и как я могу получить к нему доступ? Не уверен import script1
, следует ли мне использовать или если я должен использовать from script1 import *
для достижения этой цели.
Комментарии:
1. сделать
script1.main
возвратx
?2. Я бы предпочел альтернативу, если таковая существует. Что делать, если я хочу получить доступ к нескольким объектам? Возможно ли это?
3. ну да, вы можете возвращать несколько объектов…
4. Вы имеете в виду как повторяющийся?
5. да, как обычно:
return x,y,z
это кортеж.
Ответ №1:
Поскольку x
это локальная переменная в script1.main
функции, она недоступна извне (ни из скрипта2, ни даже из скрипта1). Фактически, объект будет отброшен после script1.main
завершения. Если вы хотите использовать его повторно, вам нужно хранить его в другом месте.
Быстрое решение состоит в том, чтобы сделать переменную x
глобальной. Тогда script2 может использовать его как script1.x
.
# script1.py
def read_file():
return "foo bar"
def main():
global x
x = read_file()
if __name__ == '__main__':
main()
# script2
import script1
def main():
script1.main()
#x = read_file()
print(script1.x)
if __name__ == '__main__':
main()
Если вы не хотите использовать global
синтаксис, альтернативой является определение изменяемой переменной в script1.py
и сохранение в ней переменной, которую вы хотите повторно использовать. Одна из возможностей-использовать class
. Здесь я использую class
в качестве изменяемого хранилища. Если вам это не нравится, другие изменяемые объекты, такие как dict
, также будут работать.
# script1.py
class data:
x = None
def read_file():
return "foo bar"
def main():
data.x = read_file()
if __name__ == '__main__':
main()
# script2
import script1
def main():
script1.main()
#x = read_file()
print(script1.data.x)
if __name__ == '__main__':
main()