重装模块已导入另一个模块

J-b*_*bob 15 python import module reload

让我们面对现实,改变它后重新加载python代码的整个过程是一团糟.我想出了一段时间后,调用import <module>解释器的效果要好from <module> import <class/function>,因为那时我可以调用reload(module)以获取更新的代码.

但我现在有更复杂的问题.所以我有这个文件,module1.py,并在顶部说:

from module2 import <class1>, <function1>, etc.
Run Code Online (Sandbox Code Playgroud)

然后我去改变module2中的代码.事实证明reload(module1),即使在module1的顶部导入了module2的代码,调用也不会重新加载module2中更改的代码.有没有办法重新加载所有内容而无需重新启动解释器?

在任何人谈到我关于风格的案例之前,我只会说:

  1. 我只reload从解释器打电话,从不在活动代码中.这个问题涉及我在测试新代码时的问题.
  2. 我从不打电话<module> import *,我知道这会破坏可读性

ojd*_*jdo 13

看看IPython.它具有自动重扩展,内自动调用函数之前的解释器会话中重新载入模块.我引用了登陆页面上的示例:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我不打算使用IPython或Jython. (3认同)

Bre*_*arn 10

要重新加载模块,您必须使用reload,并且必须在要重新加载的模块上使用它.重新加载模块不会递归地重新加载该模块导入的所有模块.它只是重新加载那个模块.

导入模块时,会存储对该模块的引用,稍后该模块的导入将重新使用已导入的已存储版本.当您重新加载时module1,它会重新运行该from module2 import ...语句,但这只是重用已导入的版本module2而不重新加载它.

解决此问题的唯一方法是更改​​代码,import module2而不是(或除此之外)from module2 import ....除非模块本身已导入并绑定到名称(即带有import module语句,而不仅仅是from module import stuff语句),否则无法重新加载模块.

请注意,您可以使用两种形式的导入,并重新导入导入的模块将影响后续from导入.也就是说,你可以这样做:

>>> import module
>>> from module import x
>>> x
2
# Change module code here, changing x to 3
>>> reload(module)
>>> from module import x
>>> x
3
Run Code Online (Sandbox Code Playgroud)

这对于交互式工作来说非常方便,因为它允许您使用简短的,没有前缀的名称来引用您需要的内容,同时仍然可以重新加载模块.