我有两个.py
脚本。 script1.py
和script2.py
我从script2.py
导入一些变量,如:
from script2 import variable1 as var1
工作正常。
但是当我在variable1
中更新 script2.py
,然后重新运行script1.py
时,variable1
的更新未显示在script1.py
。为什么会这样?
如果我完全关闭IPython然后再次重新打开IPython,则会显示variable1
的更新。但我不想一直这样做,因为我需要很少的情节才能打开。
我正在使用IPython 1.2.1
和Python 2.7.6
(如果可能需要更多信息)。
答案 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()