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

2024-04-19 17:58:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个.py脚本。script1.py和{}

我正在从script2.py导入几个变量,如:

from script2 import variable1 as var1

效果很好。在

但是当我在script2.py中更新variable1,然后重新运行script1.py,则{}的更新不会出现在script1.py中。为什么会这样?在

如果我完全关闭IPython,然后再次重新打开IPython,variable1的更新就会出现。但我不想一直这样做,因为我需要很少的情节开放。在

我正在使用IPython 1.2.1和{}(如果需要进一步的信息)。在


Tags: frompyimport脚本信息asipython情节
3条回答

如果必须经常更改变量,我认为将其写入python脚本而不是一个好方法,而是将其写入配置文件。在那里你可以简单地这样读

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

当变量写入config.cfg文件时:

^{pr2}$

您也可以将其保存为JSON,只需使用JSON读取器而不是config读取器。在

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

对于ipython,请使用^{}魔术命令:

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

有一种方法可以重新加载模块,尽管它似乎不能很好地处理别名。您可以使用^{}。正如您在文档中看到的,您的别名不会被刷新:

If a module imports objects from another module using from ... import ..., calling reload() for the other module does not redefine the objects imported from it — one way around this is to re-execute the from statement, another is to use import and qualified names (module.*name*) instead.

而是建议使用

import script2 
script2.variable1

您仍然可以使用别名,但每次都需要刷新别名:

^{pr2}$

如果不这样做,var1将保留旧值。在

但是,如果您认为有必要(如果经常发生),您可以使用一个快速函数一次性完成这些操作

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

注意我在这里使用global,这样var1在全局命名空间中被修改,而不仅仅是在该函数中声明。如果您真的只有一个值,您可以使用return var1,但我认为这是一个罕见的情况,其中{}更好。在

相关问题 更多 >