因此,我正在学习Python模块,根据我的理解,当我们在代码中尝试import
一个模块时,Python会查看该模块是否存在于sys.path
中,如果不存在,则会引发ModuleNotFoundError
sys.path
因此,假设我想从一个默认情况下不存在于sys.path
中的位置导入,我可以简单地将这个新位置附加到sys.path
中,并且一切正常,如下面的代码段所示
~/Documents/python-modules/usemymodule.py
import sys
sys.path.append("/home/som/Documents/modules")
import mymodule
mymodule.yell("Hello World")
~/Documents/python-modules/modules/mymodule.py
def yell(txt):
print(f"{txt.upper()}")
sys.path
我的疑问是,当我清除整个sys.path
列表时,我应该不能导入任何模块,但令我惊讶的是,我仍然可以导入内置的模块。下面的代码工作正常
import sys
sys.path.clear()
import math
math.ceil(10.2)
我认为python内部可能不使用sys.path
,sys.path
只是python使用的原始列表的一个浅拷贝,但是添加到sys.path
是如何工作的,为什么清除后我只能导入内置模块而不能导入自定义模块
我真的被卡住了,任何帮助都会很好。还有一个类似的问题,但它不能回答我的疑问
我试图复制您的示例,但出乎意料的是没有得到相同的结果(注意:这里是python3.9)
但是,这个有效:
我的猜测是解释器保留了以前导入中对数学模块的引用,因此不需要在
sys.path
中搜索它CPython有一个内置模块列表,如文件PC/config.c中定义的math,如下所示:
因此,当它需要导入内置模块时,它会查看此列表。列表中的每个“PyInit”函数都返回内存中的模块对象
然后将该列表公开为
sys.builtin_module_names
,该列表在sysmodule.c中初始化。然后,调用importlib._bootstrap._find_spec
中的导入代码并遍历sys.meta_path
中的导入工厂列表。其中一个是importlib._bootstrap.BuiltinImporter
,负责导入内置模块。这表明sys.meta_path
:这是在Python3.7上运行的-在不同的发行版下可能会有所不同
我想补充一点,您的测试没有考虑
sys.modules
中的模块缓存。用非构建模块来考虑这个例子:相关问题 更多 >
编程相关推荐