我有几个模块,我想重新加载而不必重新启动Sublime Text,而我正在开发一个Sublime Text包。
我正在运行Sublime Text build 3142,其中python3.3
连续运行其包/插件。但是在开发插件时,我导入了我添加到路径的第三部分模块:
import os
import sys
def assert_path(module):
"""
Import a module from a relative path
https://stackoverflow.com/questions/279237/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 )
答案 0 :(得分:4)
要列出所有导入的模块,您可以使用sys.modules.values()
。
import sys
sys.modules.values()
sys.modules
是一个字典,它将模块的字符串名称映射到它们的引用。
要重新加载模块,您可以从上面循环返回的列表,并在每个模块上调用imp.reload
:
import imp
for module in sys.modules.values():
imp.reload(module)
答案 1 :(得分:2)
我想在大多数情况下,您只想重新加载自己正在编辑的模块。这样做的一个原因是避免昂贵的重新加载,而@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中重新加载导入),它似乎足够健壮。