从Python中移除导入的模块

2 投票
4 回答
721 浏览
提问于 2025-04-18 16:18

如果我有一个叫做 "xtraimport.py" 的 Python 文件,里面有这些内容:

import os
import sys

def its_true():
    return True

当我导入这个文件时,它里面有 "os" 和 "sys" 这两个符号:

In [3]: import xtraimport
In [4]: dir(xtraimport)
Out[4]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'its_true',
 'os',
 'sys']

有没有办法去掉这些名字空间的污染?我知道这些符号是被导入到我的模块里的,但我不想让使用这个库的每个人都能看到它们。

4 个回答

0

如果我想要删除一个已经导入的模块,比如说我想删除导入的cv2模块,我可以这样做(适用于Python 3.9):

首先,我可以通过以下命令查看当前导入了哪些模块:

print(dir())

接下来,要删除cv2模块,我只需要输入:

del cv2

然后再检查一次导入的模块:

print(dir())

0

更简单吗?可能不太容易。不过如果你喜欢,这里有个解决方案。

import xtraimport
import sys
originalDir = dir(xtraimport)
newDir      = [x for x in originalDir if x not in sys.modules]

想了解更多关于 sys.modules 的信息,可以看看这里:sys.modules

0

设置 __all__ 可以让你指定模块的公共接口中包含哪些名字。虽然这并不会真正阻止其他名字被访问,但它会影响到 from foo import * 的行为、文档生成工具(pydoc),而且可能会影响到自动补全功能,这取决于你使用的自动补全软件。

举个例子:

__all__ = ["my_function", "MyClass"]

1

有一种方法可以让你对这个情况有更多的控制,那就是把你的模块变成一个包。在Python的路径下,创建一个叫做xtraimport的文件夹。在这个文件夹里放两个文件:(1) xtraimport.py 和 (2) __init__.py。对于__init__.py的内容,你可以使用:

from xtraimport import its_true

这样一来,只有its_true这个内容是直接可用的:

In [1]: import xtraimport

In [2]: dir(xtraimport)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'its_true',
 'xtraimport']

xtraimport里的所有内容仍然可以被那些愿意多花点时间的用户访问:

In [3]: dir(xtraimport.xtraimport)
Out[3]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'its_true',
 'os',
 'sys']

撰写回答