从另一个脚本导入变量并保持更新

时间:2015-12-02 09:53:10

标签: python python-2.7 ipython python-import

我有两个.py脚本。 script1.pyscript2.py

我从script2.py导入一些变量,如:

from script2 import variable1 as var1

工作正常。

但是当我在variable1更新 script2.py,然后重新运行script1.py时,variable1的更新未显示在script1.py。为什么会这样?

如果我完全关闭IPython然后再次重新打开IPython,则会显示variable1的更新。但我不想一直这样做,因为我需要很少的情节才能打开。

我正在使用IPython 1.2.1Python 2.7.6(如果可能需要更多信息)。

4 个答案:

答案 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更好的罕见情况。

答案 1 :(得分: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

答案 2 :(得分: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阅读器而不是配置阅读器。

最后,您可以使用getVar('var1')获取变量,它始终是最新的。

答案 3 :(得分:0)

将值存储在文件中会更容易。例如,在第一个脚本中,您将拥有:

> cartesian [[1;2;3];[4];[5;6]] |> Seq.toArray;;
val it : seq<int> [] =
  [|seq [1; 4; 5]; seq [1; 4; 6]; seq [2; 4; 5]; seq [2; 4; 6]; seq [3; 4; 5];
    seq [3; 4; 6]|]

在第二个脚本中你会得到:

myvar = 6

# do stuff

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