Передать переменную между скриптами 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 и так далее. В противном случае вы закончите с конфликтами имен, о которых вы не знали.