您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何取消导入Python模块?

如何取消导入Python模块?

我认为这篇文章应该对您有帮助

编辑:为了确保此信息的可用性(如果链接消失或类似原因),我将在此处包括来自教师邮件列表的原始消息:

Dick Moores在2006年8月14日写道:

实际上,我的问题是,在使用IDLE进行模块的一些导入和变量的初始化之后,如何将其返回到其初始状态而不关闭并重新打开它。

因此,例如,在我完成之后

>>> import math, psyco
>>> a = 4**23

我如何清除这些而不关闭IDLE?(我曾经知道如何,但是我已经忘记了。)

嗨,迪克,

通常,这需要从“模块注册表”中删除并在代码删除对其的引用。如果您有一个使用 得很 好的模块(例如将配置参数导入到每个模块中的模块),那么您将有一个额外的步骤将其从同样,如果您使用了“ from psyco import …”,那么您将无法轻松释放该模块以及对该模块的引用(是从该模块导入,还是从第三个模块导入?请参阅“如果偏执狂:下面的代码)。

下面的函数从Python解释器中按名称删除模块,“ paranoid”参数是要从其他所有模块中删除的变量名的列表(假定已与该模块一起删除)。对偏执的参数要非常小心;如果您的函数和类在不同的模块中被命名为相同的名称,则可能会对解释器造成问题。一种常见的情况是例外情况下的“错误”。许多库在模块中都有一个称为“错误”的“包罗万象”异常。如果您也将异常命名为“错误”并决定将其包括在偏执狂列表中,那么……还有很多其他异常对象。

def delete_module(modname, paranoid=None):
    from sys import modules
    try:
        thismod = modules[modname]
    except KeyError:
        raise ValueError(modname)
    these_symbols = dir(thismod)
    if paranoid:
        try:
            paranoid[:]  # sequence support
        except:
            raise ValueError('must supply a finite list for paranoid')
        else:
            these_symbols = paranoid[:]
    del modules[modname]
    for mod in modules.values():
        try:
            delattr(mod, modname)
        except AttributeError:
            pass
        if paranoid:
            for symbol in these_symbols:
                if symbol[:2] == '__':  # ignore special symbols
                    continue
                try:
                    delattr(mod, symbol)
                except AttributeError:
                    pass

然后,您应该可以像这样使用它:

delete_module('psyco')

要么

delete_module('psyco', ['Psycho', 'KillerError'])
# only delete these symbols from every other module
# (for "from psyco import Psycho, KillerError" statements)

-弓箭

python 2022/1/1 18:39:10 有260人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶