如何重新加载所有导入的模块?
How to reload all imported modules?
我有几个模块,我想重新加载而不必重新启动 Sublime Text,同时我正在开发 Sublime Text 包。
我是 运行 Sublime Text build 3142,它附带 python3.3
运行 连续 packages/plugins。但是,在开发插件时,我将添加到路径中的第三方模块导入为:
import os
import sys
def assert_path(module):
"""
Import a module from a relative path
"""
if module not in sys.path:
sys.path.insert( 0, module )
current_directory = os.path.dirname( os.path.realpath( __file__ ) )
assert_path( os.path.join( current_directory, 'six' ) ) # https://github.com/benjaminp/six
import six
但是当我编辑模块的源代码时 six
我需要关闭并再次打开 Sublime Text,否则 Sublime Text 不会获取对 six
python 的更改模块。
到目前为止我尝试过的一些代码:
print( sys.modules )
import git_wrapper
imp.reload( find_forks )
imp.reload( git_wrapper )
imp.reload( sys )
- Proper way to reload a python module from the console
- Reloading module giving NameError: name 'reload' is not defined
要列出所有导入的模块,您可以使用sys.modules.values()
。
import sys
sys.modules.values()
sys.modules
是一个字典,将模块的字符串名称映射到它们的引用。
要重新加载模块,您可以遍历上面返回的列表并对每个模块调用 importlib.reload
:
import importlib
for module in sys.modules.values():
importlib.reload(module)
我想在大多数情况下,您只想重新加载您自己正在编辑的模块。这样做的一个原因是为了避免昂贵的重新加载,另一个在@dwanderson 的评论中暗示,当重新加载预加载的模块可能对它们的加载顺序敏感时。重新加载 importlib
本身特别有问题。无论如何,以下代码仅重新加载代码为 运行:
之后导入的模块
PRELOADED_MODULES = set()
def init() :
# local imports to keep things neat
from sys import modules
import importlib
global PRELOADED_MODULES
# sys and importlib are ignored here too
PRELOADED_MODULES = set(modules.values())
def reload() :
from sys import modules
import importlib
for module in set(modules.values()) - PRELOADED_MODULES :
try :
importlib.reload(module)
except :
# there are some problems that are swept under the rug here
pass
init()
由于 except
块,代码并不完全正确,但对于我自己的目的来说它似乎足够强大(在 REPL 中重新加载导入)。
我有几个模块,我想重新加载而不必重新启动 Sublime Text,同时我正在开发 Sublime Text 包。
我是 运行 Sublime Text build 3142,它附带 python3.3
运行 连续 packages/plugins。但是,在开发插件时,我将添加到路径中的第三方模块导入为:
import os
import sys
def assert_path(module):
"""
Import a module from a relative path
"""
if module not in sys.path:
sys.path.insert( 0, module )
current_directory = os.path.dirname( os.path.realpath( __file__ ) )
assert_path( os.path.join( current_directory, 'six' ) ) # https://github.com/benjaminp/six
import six
但是当我编辑模块的源代码时 six
我需要关闭并再次打开 Sublime Text,否则 Sublime Text 不会获取对 six
python 的更改模块。
到目前为止我尝试过的一些代码:
print( sys.modules )
import git_wrapper
imp.reload( find_forks )
imp.reload( git_wrapper )
imp.reload( sys )
- Proper way to reload a python module from the console
- Reloading module giving NameError: name 'reload' is not defined
要列出所有导入的模块,您可以使用sys.modules.values()
。
import sys
sys.modules.values()
sys.modules
是一个字典,将模块的字符串名称映射到它们的引用。
要重新加载模块,您可以遍历上面返回的列表并对每个模块调用 importlib.reload
:
import importlib
for module in sys.modules.values():
importlib.reload(module)
我想在大多数情况下,您只想重新加载您自己正在编辑的模块。这样做的一个原因是为了避免昂贵的重新加载,另一个在@dwanderson 的评论中暗示,当重新加载预加载的模块可能对它们的加载顺序敏感时。重新加载 importlib
本身特别有问题。无论如何,以下代码仅重新加载代码为 运行:
PRELOADED_MODULES = set()
def init() :
# local imports to keep things neat
from sys import modules
import importlib
global PRELOADED_MODULES
# sys and importlib are ignored here too
PRELOADED_MODULES = set(modules.values())
def reload() :
from sys import modules
import importlib
for module in set(modules.values()) - PRELOADED_MODULES :
try :
importlib.reload(module)
except :
# there are some problems that are swept under the rug here
pass
init()
由于 except
块,代码并不完全正确,但对于我自己的目的来说它似乎足够强大(在 REPL 中重新加载导入)。