从Python3中的模块重新加载组件

时间:2016-03-31 03:14:17

标签: python-3.x

此问题类似于[Python: reload component Y imported with 'from X import Y'?]。但是,显然重新加载在python 3中不起作用。

我最初有

from vb2GP import vb_Estep

然而,由于我修改了vb_Estep的错误。当我尝试使用importlib.reload(vb_Estep)重新加载时,我收到错误:

  File "<ipython-input-61-72416bca3a93>", line 1, in <module>
    importlib.reload(vb_Estep)

  File "/Users/sachin/anaconda/lib/python3.5/importlib/__init__.py", line 139, in reload
    raise TypeError("reload() argument must be module")

TypeError: reload() argument must be module

我甚至尝试importlib(vb2GP.vb_Estep)我得到错误NameError: name 'vb2GP' is not defined,这是有道理的,因为我从未导入vb2GP开始。

所以问题是,你如何使用importlib在Python3中重新加载组件。

1 个答案:

答案 0 :(得分:2)

您使用的reload函数仅适用于模块,而不能直接处理从它们导入的对象。要使用它,您需要先导入vb2GP,然后在模块对象上调用reload,然后从新版本的模块中提取重新加载的vb_Estep值。 / p>

import importlib

import vb2GP                      # import the old version of the module
vb2GP = importlib.reload(vb2GP)   # reload it
vb_Estep = vb2GP.vb_Estep         # get a reference to the value in the reloaded module

但这可能实际上并不是必要的,这取决于你如何修改&#34;当前vb_Estep值。如果您只将名称重新绑定为新值,则可以重新导入旧名称而不进行任何reload(只需再次使用from vb2GP import vb_Estep)。只有当您修改了适当的值(例如,通过更改其内容或属性而不重新绑定变量名称本身)时,才需要上面的reload代码。