python中import原理

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

在Python中,导入模块时,模块会加载到内存并存储在sys.modules字典中。模块名称可通过__name__属性查看,入口文件的__name__为__main__。导入包时,会执行__init__.py文件。模块属性变量可通过from语句引入,删除全局变量不会影响sys.modules中的缓存。若模块文件变动,可使用importlib.reload重新加载。搜索模块时,sys.path提供本地路径。

🎯

关键要点

  • 在Python中,导入模块时,模块会加载到内存并存储在sys.modules字典中。

  • 模块名称可通过__name__属性查看,入口文件的__name__为__main__。

  • 导入包时,会执行__init__.py文件,并将其作为一个模块对象放在当前的全局变量中。

  • 使用from语句可以引入模块属性变量,删除全局变量不会影响sys.modules中的缓存。

  • 若模块文件变动,可使用importlib.reload重新加载模块。

  • 搜索模块时,sys.path提供本地路径,用于查找模块文件。

🔎

延伸解读

模块导入的内存管理

在Python中,模块导入时会将模块对象存储在sys.modules字典中,这意味着即使多次导入同一模块,实际上只会加载一次。这种机制有助于节省内存和提高性能,但也要求开发者注意模块的状态变化,特别是在开发过程中频繁修改模块时。

使用importlib.reload的注意事项

当模块文件发生变化时,使用importlib.reload可以重新加载模块。然而,这种方法并不会更新已经导入的模块属性,因此在使用reload后,需确保对模块的引用是最新的,以避免出现AttributeError等错误。

sys.path的作用

sys.path是Python查找模块的路径列表。当模块不在sys.modules中时,Python会根据sys.path中的路径搜索模块文件。因此,合理配置PYTHONPATH和sys.path对于确保模块能够被正确导入至关重要,尤其是在多项目环境中。

延伸问答

Python中如何查看模块的名称?

__name__属性可以用来查看模块的名称,入口文件的__name__为__main__。

导入包时会执行什么文件?

导入包时,会执行__init__.py文件,并将其作为一个模块对象放在当前的全局变量中。

如何重新加载已修改的模块?

可以使用importlib.reload来重新加载已修改的模块。

sys.modules是什么?

sys.modules是一个字典,用于存储已加载的模块,模块名称为key,模块对象为value。

如果删除全局变量,是否会影响sys.modules中的缓存?

删除全局变量不会影响sys.modules中的缓存,因为sys.modules保存了模块的引用。

如何查找模块文件?

当sys.modules中找不到模块时,会通过sys.path中的路径来搜索模块文件。

🏷️

标签

➡️

继续阅读