2013-04-16 3 views
10

Я уверен, что это очень просто, но я не смог заставить его работать правильно. Мне нужно, чтобы мой главный питон скрипт вызова другого питона скрипт и передать переменные из оригинального сценария к сценарию, который я назвалПередача переменной между скриптами python

Так упрощенным например мой первый скрипт,

first.py 
x = 5 
import second 

и мой второй сценарий,

second.py 
print x 

, и я ожидал бы напечатать х, но я получаю

NameError: name 'x' is not defined 

Я не уверен, что импорт правильный путь для достижения этого, но если кто-то может пролить свет на него простым способом, это было бы здорово!

спасибо,


EDIT

После прочтения комментариев я думал, что я бы расширить на мой вопрос. Ответ Aswin Murugesh устраняет проблему импорта, с которой я столкнулся, однако решение не имеет желаемого результата, так как я не могу передать элементы в списке таким образом.

В first.py У меня есть список, который я обрабатываю следующий

for insert, (list) in enumerate(list, start =1): 
    'call second.py passing current list item' 

Я хотел передать каждый элемент в списке, чтобы второй файл питон для дальнейшей обработки (веб-соскоб), я не сделал хотите сделать это в first.py, поскольку это означает, что это основная программа сканирования, которая затем вызывает другие программы. Надеюсь, теперь это имеет больше смысла.

Спасибо за комментарии.

+0

Есть ли способ, которым эти два скрипта могли стать функциями внутри одного скрипта? – summea

+1

@summea Не очень полезный ответ. Да, я полагаю, что OP может попытаться обойти, не понимая основы системы импорта Python, * никогда не используя импорт, никогда *, но действительно ли вы думаете, что это полезное предложение, когда все, что ему нужно, чтобы перейти от его нынешней путаницы, - это крошечный фрагмент кода, показывающий, как использовать импорт? –

+7

В отличие от некоторых языков, «импорт» Python не просто выдает источник импортированного файла в середине содержащего файл и выполняет все это. Импортируемый файл ничего не знает об окружающей среде, поэтому этот код ломается. В вашем случае я не уверен, что импорт правильный. Правильная модуляция предложила бы проектирование second.py, чтобы она могла быть передана 'x' в качестве аргумента для функций/объектов, определенных внутри нее. –

ответ

16

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

Ответ уже сказано в этом посте SO, в самом вопросе:

Access namespace of calling module

Но я просто объяснить это здесь, в вашем контексте.

Чтобы получить то, что вы хотите в вашем случае, начать вызываемую сценарий с помощью следующей строки:

from __main__ import * 

Это позволяет получить доступ к пространству имен (все переменные и функции) сценария вызывающего абонента.

Так что теперь ваш вызывающий сценарий, как и раньше:

x=5 
import second 

и вызываемый сценарий:

from __main__ import * 
print x 

Это должно работать нормально.

+0

Спасибо, что работает отлично, я знал, что это будет просто! – DavidJB

+0

На самом деле, я просто проверил это со списком, и он, похоже, не работает, вторая программа называется ONCE для первого элемента в списке, тогда как для каждого элемента в последовательности это новый экземпляр. Также кажется, что если у меня есть вызов timer.sleep() во второй, он останавливает основную программу (сначала) ...? – DavidJB

4

использовать следующий скрипт:

first.py:

x=5 

second.py

import first 
print first.x 

это напечатает значение х. Всегда импортируемые данные сценария должны ссылаться на имя сценария, например, в first.x

+2

В качестве альтернативы 'from first import x', за которым следует' print x' Кроме того, это должно сказать 'import first', а не' import first.py' –

2

Try использование Exec Python3.5:

first.py

x=5 
exec(open('second.py').read()) 

second.py

print(x) 

Вы можете также передать х с помощью:

x=5 
myVars = {'x':x} 
exec(open('second.py').read(), myVars) 

Не с если это хороший способ.

Смежные вопросы