2015-08-03 4 views
-2

У меня возникли проблемы с получением переменных, доступных для разных скриптов python. У меня есть три сценария: shared.py test1.py test2.py
В shared.py я определяю словарь devices и инициализирую его.Как обменять переменные между скриптами python

devices = {} 

В test1.py я импортировать shared.py и добавить значение в devices

import shared 
shared.devices['item1': 'item1'] 

В test2.py, я импортировать shared.py и попытаться напечатать обновленный devices в shared.py

import shared 
print shared.devices 

Вместо печать обновленного значения дает мне пустой словарь. Я понимаю, что когда я импортировал shared в test2.py, коды shared.py выполняются снова, так что приводит к повторной инициализации devices

Есть ли способ, что я могу получить доступ в test2.py обновленного devices? Заранее спасибо.

Update1: я изменил свой shared.py test1.py и test2.py в соответствии с аналогичным решением от link, а затем добавил test3.py

# shared.py 
def init(): 
    global devices 
    devices = {} 

# test1.py 
import shared 

def add(key, value): 
    shared.devices[key] = value 

# test2.py 
import shared 
import test1.py 

shared.init() 
test1.add('key1', 'value1') 
print shared.devices 

# test3.py 
import shared 
print shared.devices 

Я выполнил сценарии в следующем порядке :
питон test1.py (отлично)
питон test2.py (отлично)
питон test3.py (который дает мне ошибку: "AttributeError: 'модуль' объект не имеет атрибута" устройств")

UPDATE2: Чтобы сделать мой вопрос более реалистичным. У меня есть login.py, который принимает несколько аргументов и пытается подключиться к коммутатору.
Например:
Python login.py --ip 10.1.1.1 --username администратор --password администратор

# login.py - pseudocode 
switch = Switch() #create an object of Router class 
switch.connect(ip, username, password) #take the arguments from the command line and try to connect to a router 
switch_dict[admin] = switch #add switch instance to a shared dictionary switch_dict, which will be used by over scripts as well. 

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

# vlan.py - pseudocode 
# first I need to get the switch that was created by admin, not other users 
my_switch = switch_dict['admin'] 
# Then I can perform some configuration on vlan 
my_switch.createvlan() 

проблема заключается в том, как я могу создать и сохранить словарь switch_dict, который может быть общим и доступ другие сценарии ??

+0

Я не уверен, что это только для понимания, но если вы делаете это в реальном коде, вам, вероятно, следует подумать о другой архитектуре. –

+0

Возможное дублирование: http://stackoverflow.com/questions/13034496/using-global-variables-between-files-in-python –

+0

@SlaterTyranus Любые предложения? –

ответ

0

Вам нужна отдельная форма совместного хранения. Вы можете использовать (в зависимости от того, что вы делаете):

  1. Очередь или труба (documentation).

  2. Общая память (documentation).

  3. Третий независимый магазин, такой как файл (вы можете использовать json или pickle для сериализации объекта), memcache, redis, sqlite или базу данных.

Суть в том, что это не тривиально, и вам необходимо решить (на основе приложения), какой вариант работает для вас.

+0

2. В документации говорится: «Как упоминалось выше, при выполнении параллельного программирования обычно лучше избегать использования общего состояния, насколько это возможно. Это особенно верно при использовании нескольких процессов». Поэтому вопрос в том, что он сделал все возможное, чтобы этого избежать? – skyking

+0

@skyking Я обновил свой вопрос, чтобы сделать его более реалистичным, и я надеюсь, что это сделает мой вопрос более ясным. Не могли бы вы еще раз взглянуть на него? –

+0

@yin_bill_wang Это похоже, что вы не обращаетесь к данным одновременно, и похоже, что только один скрипт изменяет дату, это хорошо. Решение проблемы может быть номером 3. В основном вы должны сохранять данные, когда 'login.py' заканчивается, а затем читать данные в' vlan.py'. Если вы не ожидаете параллелизма, вы можете использовать 'pickle' для этого. – skyking

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