如何重新加载所有导入的模块?

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)
  1. 从控制台重新加载python模块的正确方法
  2. 重新加载模块,给出NameError:名称'reload'未定义

t.y*_*t.y 6

我想在大多数情况下,您只想重新加载您自己正在编辑的模块。这样做的一个原因是避免昂贵的重新加载,另一个在@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 中重新加载导入)来说,它似乎足够健壮。


cs9*_*s95 5

要列出所有导入的模块,可以使用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)

  • 这似乎在“iPython”中运行得不好/顺利 - 有什么想法吗? (3认同)
  • 是的,抱歉,这是一个空评论 - 首先,我收到一堆“无法重新加载 <module 'rlcompleter' from '/{...}/lib/python3.6/rlcompleter.py'>`,然后当我尝试 `reload(my_module)` 我得到:`/{...}/lib/python3.6/importlib/_bootstrap.py in cached(self) NotImplementedError:` - 可能是因为 `iPython` 模块本身得到`重新加载`,他们不喜欢那样? (2认同)