解释器执行时,
首先搜索 built-in module ,也就是解释器查找模块最先查找的是built-in module ,
其次搜索 sys.path所包含的路径。
这样的查找顺序将会引起同名包或模块被遮蔽的问题。
文件目录结构
├── os.py
├── test2.py
├── redis.py
test2.py
文件内容
import os
from redis import Redis
linux
命令行执行test2.py
:
python test.py
执行结果:
Traceback (most recent call last):
File "test.py", line 2, in <module>
from redis import Redis
ImportError: cannot import name Redis
由于os
是 built-in module
,即使在同目录下有同名模块,解释器依然可以找到正确的os
模块,而 redis
属于第三方模块,默认安装位置是 python
环境变量中的 site-packages
下,解释器启动之后会将此目录加入 sys.path
,按照上面所说的查找顺序,优先在执行文件所在的目录查找,由于其在 sys.path
的首位,因而本地的redis
被导入。
注意:
sys.argv[0]
是获得入口执行文件路径,
__file__
是获得任意模块文件的路径。
sys.path
打印出来的列表在终端第一个元素是空字符串,但不影响使用。在pycharm
不是空字符串。进入交互式执行环境,解释器会自动把当前目录加入 sys.path, 这时当前目录是以相对路径的形式出现在 sys.path 中:
>>> import os.path >>> import sys >>> os.path.abspath(sys.path[0]) '/home/l/PycharmProjects/test_modules'
核心风格: import 语句的模块顺序
推荐所有的模块在 Python 模块的开头部分导入。
而且最好按照以下顺序:
1,Python 标准库模块
2,Python 第三方模块
3,应用程序自定义模块
网友评论