如何在python3.3中重新加载所有导入的模块?

时间:2017-07-30 23:13:05

标签: python module python-import

我有几个模块,我想重新加载而不必重新启动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 )
  1. Proper way to reload a python module from the console
  2. Reloading module giving NameError: name 'reload' is not defined

2 个答案:

答案 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中重新加载导入),它似乎足够健壮。