Ответ 1
Правильный синтаксис:
from script1 import x
Итак, буквально, "из script1.py импортируйте объект" x ".
У меня есть 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".
Правильный синтаксис:
from script1 import x
Итак, буквально, "из script1.py импортируйте объект" x ".
Попробуйте следующее:
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 как параметр функции и делать все, что вам нужно с ним.
Ваш код зацикливается, потому что вызов 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
может измениться во время выполнения, вам понадобится фактический метод межпроцессного обмена.
script1.py:
x = 2
from script2 import *
script2.py:
from script1 import x
print x
Script 0:
#!/usr/bin/env python
from script1 import x
print x
Script 1:
#!/usr/bin/env python
x = "Hello world"
Вывод:
Hello world
Так что да, это работает, нет необходимости в подпроцессах.
Я думаю, вы должны ссылаться на переменную, префикс ее имени модуля (т.е. script1.x) в script2.py
Используемый метод является более сложным, чем необходимо. После исправления BO (я предполагал, что он подразумевается как строковый литерал, поэтому я процитировал его), и, предполагая, что сценарии размещены в одном месте, вы можете вызвать script2 и получить нужный результат.
Смотрите следующее:
#script1.py
print "BLAH"
x = "BO"
#script2.py
from script1 import x
print "HELLO"
print x
$ python script2.py
BLAH
HELLO
BO