Как получить доступ к динамической переменной скрипта Python из другого скрипта Python?

#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()