2015-12-02 2 views
1

У меня есть два сценария .py. script1.py и script2.pyИмпорт переменной из другого скрипта и ее обновление

Я ввожу несколько переменных из script2.py как:

from script2 import variable1 as var1 

, который прекрасно работает.

Но когда я обновитьvariable1 в script2.py, а затем повторно запустить script1.py, обновление variable1 не отображается в script1.py. Почему это так?

Обновление variable1 появляется, если я полностью закрываю IPython, а затем снова заново открываю IPython. Но я не хочу делать это все время, так как мне нужно, чтобы какой-то сюжет был открыт.

Я использую IPython 1.2.1 и Python 2.7.6 (если может понадобиться дополнительная информация).

+1

' import' берет файл в этот момент и не проверяет, проверяет ли файл позже. Поэтому вы не будете получать обновления для любых функций или переменных, которые вы обновляете в исходном файле script2.py. Вы можете удалить импортированный пакет с помощью 'del var1', а затем импортировать его снова, я думаю, что это должно сработать. И если вам нужно регулярно обновлять свой скрипт2.py, вам может понадобиться другой подход, например, написать вашу переменную в файле конфигурации и всегда перезагружать ее оттуда. –

+0

@Memnon: Не могли бы вы рассказать о том, как можно сделать вышеупомянутое решение, о котором вы упоминали? – ThePredator

+0

Вы имеете в виду подход с использованием файла конфигурации? –

ответ

2

Существует способ перезагрузки модулей, хотя, похоже, он не работает с псевдонимом. Вы можете использовать reload(module_name). Как вы увидите документы, обратите внимание, что ваши псевдонимы обыкновения быть обновлены:

Если импортирует модуль объектов из другого модуля, используя from ... import ..., вызывая reload() для другого модуля не переопределяющего объектов, импортированных из него - один пути вокруг этого заключается в том, чтобы повторно выполнить оператор , а другой - использовать импортные и квалифицированные имена (module.*name*).

Вместо этого он предлагает использовать

import script2 
script2.variable1 

Вы могли все еще псевдоним, но вам необходимо обновить псевдонимами имена каждый раз:

import script2 
var1 = script2.variable1 

... 

reload(script2) 
var1 = script2.variable1 

Если вы не сделали этого, var1 сохранит старое значение.

Вы, однако, может иметь быструю функцию, чтобы сделать все это сразу, если вы думаете, что это необходимо (и если это часто случается)

def reload_script2(): 
    global var1 
    reload(script2) 
    var1 = script2.variable1 

Примечание Я использую global здесь, так что var1 модифицируется в глобальном пространство имен, не просто объявленное в этой функции. Если у вас действительно есть только одно значение, вы можете использовать return var1, но я думаю, что это редкий случай, когда global лучше.

+0

, так что 'reload (script2)' должен быть в Ipython или должен быть в 'script1'? – ThePredator

+0

@ThePredator В IPython это похоже на повторный импорт модуля и перезапись его. – SuperBiasedMan

0

Если вам приходится часто менять переменные, я думаю, что это не очень хороший подход, чтобы записать его в скрипт python, а скорее в файл конфигурации.Там вы можете просто прочитать, как этот

def getVar(name): 
    c = ConfigParser.SafeConfigParser() 
    c.read('config.cfg') 
    return c.get('global',name) 

В то время как переменная записывается в файл config.cfg так:

[global] 
var1 = 5 
var2 = 10 

Вы также можете сохранить его в формате JSON и просто использовать читателя JSon вместо config reader.

В конце вы можете получить свою переменную с getVar('var1'), и она всегда будет актуальной.

0

Было бы проще просто сохранить значение в файле. Например, в первом сценарии вы бы:

myvar = 6 

# do stuff 

config_file = open('config.txt', 'w') 
config_file.write(myvar) 
config_file.close() 

и во втором сценарии вы бы:

config_file_read = open('config.txt', 'r') 
oldvar = int(config_file_read.read()) # you could also do float() (or any type) 
config_file_read.close() 

print oldvar 

newvar = 5 
config_file_write = open('config.txt', 'w') # this overwrites the contents of the file 
config_file_write.write(str(newvar)) 
config_file_write.close() 
2

Для IPython, используйте %load волшебную команду:

In [1]: from a import x 

In [2]: x 
Out[2]: 20 

# here go and change the content of a.py 

In [3]: from a import x 

In [4]: x 
Out[4]: 20 # same value 

In [5]: %load a.py 

In [6]: # %load a.py 
x = 22 

In [7]: x 
Out[7]: 22 # new value 
+0

Нет, это не работает! Когда я '% load script2.py' после обновления' variable1', он все равно, кажется, дает старое значение при запуске 'script1.py' – ThePredator

+0

Он даст вам новое значение в интерпретаторе ipython (как показано в ответе), он не будет автоматически обновлять значение в файле 'script1.py'. –

+0

Но это то, что я хочу! Есть ли способ сделать это? – ThePredator