目录结构如下
|- demo
| - pkg
| -- __init__.py
| -- main.py
| -- numpy.py
其中numpy.py和__init__.py内容都为空,main.py的内容如下:
from __future__ import print_function
from __future__ import absolute_import
import sys
import numpy as np
print(sys.path)
print(np.array([0]))
当我们在demo目录下,即和pkg文件夹同级的目录下运行python脚本, 即
python -m pkg.main
得到如下结果
['', 'D:\\python3.5\\python36.zip', 'D:\\python3.5\\DLLs', 'D:\\python3.5\\lib', 'D:\\python3.5', 'D:\\python3.5\\lib\\site-packages', 'D:\\python3.5\\lib\\site-packages\\win32', 'D:\\python3.5\\lib\\site-packages\\win32\\lib', 'D:\\python3.5\\lib\\site-packages\\Pythonwin']
[0]
其中第一个list就是sys.path, 也就是该py文件寻找库的路径。注意:这里是pkg.main
但是假如我们直接调用即还是在原来的地方执行
python pkg\main.py
得到的结果是:
['E:\\demo\\pkg', 'D:\\python3.5\\python36.zip', 'D:\\python3.5\\DLLs', 'D:\\python3.5\\lib', 'D:\\python3.5', 'D:\\python3.5\\lib\\site-packages', 'D:\\python3.5\\lib\\site-packages\\win32', 'D:\\python3.5\\lib\\site-packages\\win32\\lib', 'D:\\python3.5\\lib\\site-packages\\Pythonwin']
Traceback (most recent call last):
File "pkg\main.py", line 6, in
print(np.array([0]))
AttributeError: module 'numpy' has no attribute 'array'
可以看到在这次的结果中,第一个list的第一个路径是demo\pkg, 也就是运行脚本的路径。换句话说,直接调用某py文件, 会将该py文件所在的同级目录添加到sys.path的top_level, 而在模块调用时候就不会添加。因此当你通过直接调用的方式(即直接调用python yyy.py)的时候,并不能检验出引入还是没有引入absolute_import模块的区别。同时这也解释了,当a.py模块被调用,同时a.py模块与调用的py文件不在同级目录,并且a.py模块需要调用与自己(a.py)同级目录模块,需要在a.py文件下显示的将a.py同级目录添加到sys.path中。即
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
https://www.python.org/dev/peps/pep-0328/