从Python中移除导入的模块
如果我有一个叫做 "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']