Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何反导入Python模块?_Python - Fatal编程技术网

如何反导入Python模块?

如何反导入Python模块?,python,Python,我正在编写一个应用程序,它必须从几个模块(.py文件)中获取元数据(作者、版本等)并显示它们。用户选择一个脚本并执行该脚本。(新脚本可以添加,旧脚本可以从目标文件夹中取出,就像插件系统一样) 首先,我导入一个脚本,取出元数据,然后进行下一步。 但是我想反导入除用户选择的模块之外的所有其他模块 我如何实现这一点 我试过这些 1. del module 2. del sys.modules['module'] 后者不起作用。我尝试了#python,得到的答案是反导入模块不好,但我想知道一种干净的实

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

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

我如何实现这一点

我试过这些

1. del module
2. del sys.modules['module']
后者不起作用。我尝试了#python,得到的答案是反导入模块不好,但我想知道一种干净的实现方法。任何想法/建议都会有帮助。

我想应该对你有帮助

编辑: 为了确保此信息的可用性(在链接失效或类似情况下),我将在此处包含原始消息:


2006年8月14日,迪克·摩尔写道:

实际上,我的问题是,在使用IDLE做一些导入 模块和初始化变量,如何将其返回到 初始条件,不关闭并重新打开它

比如说,在我完成之后

>>> import math, psyco
>>> a = 4**23
我怎样才能在不关闭空闲的情况下清除这些? (我以前知道怎么做,但我忘了。)

嗨,迪克

通常这需要从“模块注册表”中删除并删除 如果你有一个非常好用的模块(比如 一个配置参数导入到每个模块中),然后您将有一个 从每个模块中删除它的附加步骤。此外,如果您使用 “从psyco导入…”,则无法释放模块和 对模块的引用很容易(是来自该模块,还是从 第三个模块?参见“如果是偏执狂:下面的代码”)

下面的函数按名称从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')


-Arcege

建议:使用
动态导入模块

例如

将产生:

name: os - module_obj: <module 'os' from '/usr/lib64/python2.4/os.pyc'>
name: decimal - module_obj: <module 'decimal' from '/usr/lib64/python2.4/decimal.pyc'>
name: random - module_obj: <module 'random' from '/usr/lib64/python2.4/random.pyc'>

我知道这篇文章已经过时了,但我刚刚遇到了这个问题,在过去的几天里一直在与之抗争。现在我得出了一个可以完美解决这个问题的结论。请参见下面的示例代码:

try:
    theMod = sys.modules['ModNeedToBeDel']   
except:
    theMod = None
if theMod:
    del sys.modules['ModNeedToBeDel']

#The extra try/except below is because I implemented the block in a module of a sub-package; this ModNeedToBeDel in my case was imported either by the toppest level Main code, or by the other sub-package modules. That's why I need two different try/except.

try:
    theMod = sys.modules['UpperFolder.ModNeedToBeDel']   
except:
    theMod = None
if theMod:
    del sys.modules['UpperFolder.ModNeedToBeDel']
import ModNeedToBeDel   # or UpperFolder.ModNeedToBeDel here
请注意,
del sys.modules[theMod]
不起作用,因为它只是删除引用,而不是实际的
ModNeedToBeDel


希望这能帮助一些人,这样他们就不用在这个问题上挣扎好几天了

我最近发现了这篇文章,因此用于Python 3.4或更高版本

import importlib
importlib.reload(module) 

你能总结一下这个链接的内容吗?谢谢你的链接。。。但是,除了导入元数据之外,还有其他方法获取元数据吗?没有干净的方法来卸载模块。你要做的一切都是通过黑客。通过使用
ast
模块解析代码来获取元数据,而不是像和do这样的工具导入它们。
import sys
module_list = ['os', 'decimal', 'random', 'test1']
for module_name in module_list:
    x = __import__(module_name)
    print 'name: %s - module_obj: %s' % (x.__name__, x)
    del x
    sys.modules.pop(module_name)
try:
    theMod = sys.modules['ModNeedToBeDel']   
except:
    theMod = None
if theMod:
    del sys.modules['ModNeedToBeDel']

#The extra try/except below is because I implemented the block in a module of a sub-package; this ModNeedToBeDel in my case was imported either by the toppest level Main code, or by the other sub-package modules. That's why I need two different try/except.

try:
    theMod = sys.modules['UpperFolder.ModNeedToBeDel']   
except:
    theMod = None
if theMod:
    del sys.modules['UpperFolder.ModNeedToBeDel']
import ModNeedToBeDel   # or UpperFolder.ModNeedToBeDel here
import importlib
importlib.reload(module)