递归模块导入和重新加载

Alb*_*ras 17 python reload python-import

有人可以解释为什么执行以下代码:

文件" hello.py ":

import hello
print "hello"
hello = reload(hello)
Run Code Online (Sandbox Code Playgroud)

执行python hello.py以下打印?

hello
hello
hello
hello
Run Code Online (Sandbox Code Playgroud)

为什么4次?我知道当一个模块已经导入时,它不再被导入,但是重新加载力量来重新加载一个模块,即使它已经被加载了.我已经预料到了无限制的'你好'打印.

必须发生什么,reload不会重新加载模块?

And*_*ark 12

python hello.py(A)运行代码一次,当(A)调用import hello代码再次运行(B),当(A)和(B)调用时reload(hello),代码再运行两次,共计四次.

通常,对于程序的生命周期,模块的代码将在以下时间执行:

  • 一旦它是主要模块
  • 当它一次被任何模块导入时(包括它自己)
  • reload()在模块上调用任何时间

至于为什么reload()没有递归调用,有一个早期退出点到PyImport_ReloadModule()函数(CPython,文件是import.c)来防止这种情况:

http://svn.python.org/view/python/trunk/Python/import.c?view=markup#l2646

    ...
    existing_m = PyDict_GetItemString(modules_reloading, name);
    if (existing_m != NULL) {
        /* Due to a recursive reload, this module is already
           being reloaded. */
        Py_INCREF(existing_m);
        return existing_m;
    }
    ... load module code is below here
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解释为什么重新加载中的重新加载不会再次运行代码. (3认同)
  • 如果内存服务你曾经能够通过这样做来段落Python.美好时光,美好时光.. (2认同)

eca*_*mur 8

reload 保留当前正在重新加载的模块的列表(实际上是一个dict),以避免递归地重新加载模块.

http://hg.python.org/cpython/file/e6b8202443b6/Lib/imp.py#l236

这没有记录,但我认为你可能依赖于它仍然如此.