Импорт переменной из одного python script в другой

У меня есть script1.py, который вызывает script2.py (subprocess.call([sys.executable, "script2.py"]). Но script2.py нужна переменная x, которая известна в script1.py. Я пробовал очень простой import x from script1, но, похоже, он не работает.

Это правильный подход к использованию? Например:

#script1.py
import subprocess, sys
##subprocess.call([sys.executable, 'C:\\...\\Desktop\\script2.py'], shell=True)
##os.system("C:\\...\\Desktop\\script2.py")
subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
print "BLAH"
x = BO

#script2.py
from script1 import x
print "HELLO"
print x

Все 3 случая вызова script2 (subprocess.call, os.system, subprocess.Popen) не работают. Я получаю "BLAH", но не "HELLO".

Ответ 1

Правильный синтаксис:

from script1 import x

Итак, буквально, "из script1.py импортируйте объект" x ".

Ответ 2

Попробуйте следующее:

from script1 import x

Я просто запустил следующие фрагменты кода и работал

script1:

c = 10

Скрипт2:

from script1 import c
print c

Второй script напечатал целое число 10, как и следовало ожидать.

Октябрь 17 Изменить: В этом случае код либо не выдаст "Hello", как указано, либо перейдет в бесконечный цикл. Несколько проблем:

В том виде, в каком он находится, BO undefined. Когда вы выполняете script1, открывается подпроцесс script2. Когда script2 вызывает script1, он будет распечатывать blah, но сбой при x = BO, поскольку BO undefined.

Итак, если вы исправите это, указав BO с указанием строки, он перейдет в бесконечный цикл (каждый script вызывает другой и печатает x, Hello и Blah).

Один из возможных способов исправить это - передать x через вызов функции. Таким образом, script2 может принимать x как параметр функции и делать все, что вам нужно с ним.

Ответ 3

Ваш код зацикливается, потому что вызов subprocess.Popen находится в коде инициализации модуля, поэтому он будет вызываться скриптом2 при импорте script1 (создание нового сценария2, который также импортирует script1...)

Рекомендуемый способ иметь файл python, который можно использовать как script, так и модуль, использовать переменную __name__

#script1.py

x = BO

if __name__ == "__main__":
    import subprocess, sys
    subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
    print "BLAH"

Но также считаем, что это работает только для констант. Если x может измениться во время выполнения, вам понадобится фактический метод межпроцессного обмена.

Ответ 4

script1.py:

x = 2
from script2 import *

script2.py:

from script1 import x
print x

Ответ 5

Script 0:

#!/usr/bin/env python
from script1 import x

print x

Script 1:

#!/usr/bin/env python
x = "Hello world"

Вывод:

Hello world

Так что да, это работает, нет необходимости в подпроцессах.

Ответ 6

Я думаю, вы должны ссылаться на переменную, префикс ее имени модуля (т.е. script1.x) в script2.py

Ответ 7

Используемый метод является более сложным, чем необходимо. После исправления BO (я предполагал, что он подразумевается как строковый литерал, поэтому я процитировал его), и, предполагая, что сценарии размещены в одном месте, вы можете вызвать script2 и получить нужный результат.

Смотрите следующее:

#script1.py
print "BLAH"
x = "BO"

#script2.py
from script1 import x
print "HELLO"
print x

$ python script2.py 
BLAH
HELLO
BO