Передать переменную между скриптами python
Я уверен, что это очень просто, но я не смог заставить его работать правильно. Мне нужно, чтобы мой основной скрипт python вызывал другой скрипт python и передавал переменные из исходного скрипта в скрипт, который я назвал
Итак, для упрощенного примера мой первый скрипт:
first.py
x = 5
import second
и мой второй скрипт,
second.py
print x
и я ожидал бы, что он напечатает x, но я получаю
NameError: name 'x' is not defined
Я не уверен, что импорт является правильным способом достижения это, но если бы кто-то мог пролить свет на это простым способом, это было бы здорово!
спасибо,
редактировать
после прочтения комментариев я думал, что расширю свой вопрос. Aswin Murugesh answer исправляет проблему импорта, которую я имел, однако решение не имеет желаемого результата, поскольку я не могу передать элементы в списке таким образом.
In first.py у меня есть список, который я обрабатываю следующим образом
for insert, (list) in enumerate(list, start =1):
'call second.py passing current list item'
Я хотел передать каждый элемент в списке во второй файл python для дальнейшей обработки( веб-скрейпинг), я не хотел делать это в first.py поскольку это должна быть основная программа "сканирования", которая затем вызывает другие программы. Надеюсь, теперь в этом больше смысла.
Спасибо за комментарии до сих пор.
4 ответов
при вызове скрипта вызывающий скрипт может получить доступ к пространству имен вызываемого скрипта. (В вашем случае, первый доступ к пространству имен второй.) Однако то, о чем вы просите, - это наоборот. Ваша переменная определена в вызывающем скрипте,и вы хотите, чтобы вызываемый скрипт получил доступ к пространству имен вызывающего.
ответ уже указан в этом посте SO, в самом вопросе:
пространство имен доступа вызываем модуль
но я просто объясню это здесь, в вашем контексте.
чтобы получить то, что вы хотите, в вашем случае, начните с названием script с следующую строку:
from __main__ import *
Это позволяет ему получить доступ к пространству имен (все переменные и функции) вызывающего скрипта.
Итак, теперь ваш вызывающий скрипт, как и раньше:
x=5
import second
и вызываемый скрипт:
from __main__ import *
print x
Это должно работать нормально.
использовать следующий скрипт:
first.py:
x=5
second.py
import first
print first.x
выводит значение x. Всегда импортируемые данные скрипта должны ссылаться на имя скрипта, как в first.x
попробуйте использовать exec Питон3.5:
first.py
x=5
exec(open('second.py').read())
second.py
print(x)
вы также можете передать x с помощью:
x=5
myVars = {'x':x}
exec(open('second.py').read(), myVars)
не уверен, что это хороший способ.
чтобы избежать загрязнения пространства имен, импортируйте переменные по отдельности:from __main__ import x
и так далее. В противном случае вы закончите с конфликтами имен, о которых вы не знали.