python

python 执行时是如何查找包和模块的

2020-06-15  本文已影响0人  wit92

解释器执行时,

首先搜索 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

由于osbuilt-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,应用程序自定义模块

上一篇 下一篇

猜你喜欢

热点阅读