最近一直被python包导入绊倒,所以打算好好学习一下python包模块搜索路径
外部的terminal中运行,不是IDE中
import的时候,Python Interpreter首先搜寻built-in module中有没有叫这个名的(比如os模块, 用__builtins__查看
),若是没有才会到sys.path去搜索,顺序如下:
- 被执行python脚本的所在路径
- PYTHONPATH变量包含的路径
- python标准库 比如json库等
- 第三方库(site-packages)
案例解释
以下默认是在外部的shell中运行,不是IDE中
.
├── A
│ ├── a1.py
│ ├── config.py
├── a2.py
├── config.py
a1.py、a2.py中都是如下代码
import sys
print(sys.path)
cd 到该工程目录假如是 ~/Test
python A/a1.py
输出:
[’/home/xxx/Test/A’,…]
python a2.py
输出:
[’/home/xxx/Test’,…]
所以要注意的是当python A/a1.py
时,如果A/a1.py导入本工程内的包名和PYTHONPATH中的包名有重复时,就会先导入了PYTHONPATH,而python a2.py
不会有这种情况,因为工程目录在PYTHONPATH前了
或者这种情况:
a1.py中import config
,这时导入的是A/config.py
,而不是./config.py
附录
在pycharm中内置的terminal
- 被执行python脚本的所在路径
- PYTHONPATH变量包含的路径
- 当前工程目录
- python标准库
- 第三方库(site-packages)
在pycharm中右键run
- 被执行python脚本的所在路径
- 当前工程目录 注意和上面插入的位置不同
- PYTHONPATH变量包含的路径
- python标准库
- 第三方库(site-packages)