前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解python的import与__import__

理解python的import与__import__

作者头像
qsjs
发布2020-06-08 12:17:18
1.6K0
发布2020-06-08 12:17:18
举报

import 和“__import__”都是用来导入module的,但是二者还是有所不同, 可以查看帮助文档来了解其不同. 先通过 help("import") 查看其帮助,可以找到如下的说明:

代码语言:javascript
复制
The basic import statement (no "from" clause) is executed in two
steps:
1. find a module, loading and initializing it if necessary
2. define a name or names in the local namespace for the scope  where the "import" statement occurs.

上面描述了import 做的两步工作,首先是 查找一个模块,然后初始化这个模块,我个人对这一步的理解是这样的: 首先是根据sys.path的值,在相应的目录下查找以module name 命名的.pyc/.py 文件或者目录,如果找到的是.py/.pyc 文件(比如socket 模块), 那么就执行这个.py/.pyc 文件,从而完成导入;如果找到的是以module name 命名的目录,这个目录里面通常包含一个 __init__.py / __init__.pyc 的文件, 就是调用这个文件来完成模块导入以及初始化的(比如 pkg_resources 模块). import 除了载入模块并完成初始化,还做了step 2 的工作:在import 发生的scope, 定义相应的namespace.

再通过help(__import__) 查看其帮助,我们可以看到如下的片段:

代码语言:javascript
复制
    __import__(name, globals=None, locals=None, fromlist=(), level=0) -> module
    Import a module. Because this function is meant for use by the Python
    interpreter and not for general use it is better to use
    importlib.import_module() to programmatically import a module.

这里可以看到 __import__ 是一个方法,这是__builtins__ 模块内置的一个方法,返回值是一个module,所以可以通过 __import__(ModuleName).Method的方式来使用,比如在一些项目中会看到__import("pkg_resources")__.run_script() 这样的方式来使用这种导入

既然两者都可以导入module, 那么使用上怎么选择呢? import 导入模块之后,就在相应的namespace 中存在了,除非明确用del 从当前的namespace中移出,否则始终可以访问到; 而用__import__ 导入,返回的是一个 模块,可以引用这个模块,但是这个模块并不会“驻留”到相应的namespace. 也就是常用于 动态加载模块,从而可以根据需要 动态使用,节省系统资源;比如某个python 程序需要引用20个模块,但是这20个模块都只是引用其中某一个方法,那么完全没有必要 让这20个模块一直驻留在相应的namespace, 从而节省系统资源;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档