use*_*ser 2 python module python-import python-3.x
我有几个模块,在开发Sublime Text软件包时,我想重新加载而不必重新启动Sublime Text。
我正在运行Sublime Text内部版本3142,该版本python3.3连续运行其软件包/插件。但是,在开发插件时,我将添加到path的第三方模块导入为:
import os
import sys
def assert_path(module):
"""
Import a module from a relative path
/sf/ask/19546621/
"""
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
Run Code Online (Sandbox Code Playgroud)
但是,当我编辑模块的源代码时,six我需要再次关闭并打开Sublime Text,否则Sublime Text无法获取对sixpython模块的更改。
到目前为止我尝试过的一些代码:
print( sys.modules )
import git_wrapper
imp.reload( find_forks )
imp.reload( git_wrapper )
imp.reload( sys )
Run Code Online (Sandbox Code Playgroud)
我想在大多数情况下,您只想重新加载您自己正在编辑的模块。这样做的一个原因是避免昂贵的重新加载,另一个在@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()
Run Code Online (Sandbox Code Playgroud)
由于except块的原因,代码并不完全正确,但对于我自己的目的(在 REPL 中重新加载导入)来说,它似乎足够健壮。
要列出所有导入的模块,可以使用sys.modules.values()。
import sys
sys.modules.values()
Run Code Online (Sandbox Code Playgroud)
sys.modules 是将模块的字符串名称映射到其引用的字典。
要重新加载模块,您可以从上方遍历返回的列表,然后分别调用imp.reload:
import imp
for module in sys.modules.values():
imp.reload(module)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5236 次 |
| 最近记录: |