在 Python 中,您可以按如下方式重新加载模块...
import foobar
import importlib
importlib.reload(foobar)
这适用于.py
文件,但对于 Python 包,它只会重新加载包并not任何嵌套的子模块。
带包:
foobar/__init__.py
foobar/spam.py
foobar/eggs.py
Python脚本:
import foobar
# assume `spam/__init__.py` is importing `.spam`
# so we dont need an explicit import.
print(foobar.spam) # ok
import importlib
importlib.reload(foobar)
# foobar.spam WONT be reloaded.
并不是说这是一个错误,但有时重新加载包及其所有子模块很有用。(例如,如果您想在脚本运行时编辑模块).
在 Python 中递归重新加载包有哪些好方法?
Notes:
-
为了这个问题的目的,假设最新的Python3.x
(目前使用importlib
)
- 允许这可能需要对模块本身进行一些编辑。
- 假设未使用通配符导入(
from foobar import *
),因为它们可能会使重新加载逻辑变得复杂。
这是一个递归加载包的函数。
仔细检查重新加载的模块是否在使用它们的模块中进行了更新,并检查了无限递归的问题。
一个限制是它需要在包上运行(无论如何,这只对包裹有意义)
import os
import types
import importlib
def reload_package(package):
assert(hasattr(package, "__package__"))
fn = package.__file__
fn_dir = os.path.dirname(fn) + os.sep
module_visit = {fn}
del fn
def reload_recursive_ex(module):
importlib.reload(module)
for module_child in vars(module).values():
if isinstance(module_child, types.ModuleType):
fn_child = getattr(module_child, "__file__", None)
if (fn_child is not None) and fn_child.startswith(fn_dir):
if fn_child not in module_visit:
# print("reloading:", fn_child, "from", module)
module_visit.add(fn_child)
reload_recursive_ex(module_child)
return reload_recursive_ex(package)
# example use
import os
reload_package(os)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)