当前位置: 首页 > 面试题库 >

如何取消导入Python模块?

楚威
2023-03-14
问题内容

我正在编写一个应用程序,该应用程序必须从几个模块(.py文件)中获取元数据(author,version..etc)并显示它们。用户选择一个脚本并执行该脚本。(可以像插件系统一样从目标文件夹中添加新脚本,并从目标文件夹中获取旧脚本)。

首先,我导入一个脚本,然后取出元数据,然后继续下一步。但是我想取消导入除用户选择的模块以外的所有其他模块。

我该如何实施?

我尝试了这些

1. del module
2. del sys.modules['module']

后者不起作用。我尝试#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,我已经安装在C:\ INFO2013-07-08 08:15:47,197server.py:593]默认:"GET/HTTP/1.1"500-INFO2013-07-08 08:28:22,289api_server.py:509]应用所有挂起的事务并保存数据存储INFO2013-07-08 08:28:22,289api_server.py:512]保存搜索索引2013-

  • 问题内容: 如何枚举所有导入的模块? 例如,我想从以下代码中获取: 问题答案: 仅获取当前模块的所有导入的一种近似方法是检查globals()模块: 这不会返回本地导入,也不会返回非模块导入,例如。请注意,这将返回,因此如果你使用的话,将获得原始模块名称;如果你想要别名,则使用名称。

  • 我在让sikuli python单元测试工作时遇到了麻烦,希望能得到一些帮助。我在网上到处搜索,但是没有任何有用的东西。我的python知识非常有限,我想这没有什么帮助... 我用的是win7 32,sikuli 1.0 rc3 (r905),python 2.7.3 我正在尝试通过python运行sikuli单元测试(不使用命令行,只是作为一个python脚本来运行python gui)。除了别

  • 问题内容: 我正在尝试在Python 2.7.2中使用并遇到奇怪的错误。 考虑以下目录结构: 具有以下代码: (在真实代码中有一个名称。) 尝试到时,产生以下错误: 我想念什么? 谢谢! 问题答案: 对于相对进口,您必须: a)使用相对名称 b)明确提供锚点 当然,您也可以只执行绝对导入:

  • 问题内容: 如何检查我是否在代码中的某个位置导入了模块? 我想检查是否已经导入模块的原因是因为我有一个我不想导入的模块,因为有时会弄乱我的程序。 问题答案: 测试字典中的模块名称: 从文档中: 这是将模块名称映射到已经加载的模块的字典。 请注意,语句有两件事: 如果模块之前从未导入过(=中不存在= ),则将其加载并添加到中。 在当前名称空间中绑定1个或多个引用模块对象或模块名称空间成员的对象的名称

  • 我想在任何目录的任何脚本中导入自定义编写的函数,就像在任何脚本中导入请求模块一样。我正在运行Ubuntu和Python 3.9 编辑:我按照本教程完成了我的要求-https://packaging.python.org/tutorials/packaging-projects/