python3下的import模块层次关系总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winycg/article/details/82021728

本代码测试实验环境为Pycharm的pythonproject目录下。
1.假设文件夹A包含两个py文件,那么此时某个py文件的模块搜索路径为

A
    a.py
    b.py
import sys
print(sys.path)
Output:
['/home/winycg/pythonproject/A',
'/home/winycg/pythonproject', 
'/home/winycg/anaconda3/lib/python36.zip', 
'/home/winycg/anaconda3/lib/python3.6', 
'/home/winycg/anaconda3/lib/python3.6/lib-dynload', 
'/home/winycg/anaconda3/lib/python3.6/site-packages']

以上可以看出,搜索路径首先为当前py文件所在的目录,之后是pycharm的工程目录,最后是anaconda库路径。
此时b.py调用a.py时只需要使用:

import a

此时可在/home/winycg/pythonproject/A下找到a.py
使用如下语句都是有问题的:

from . import a
from A import a

2.在如下结构的层次关系中:

A
——— AA
    ——— a.py
    ——— c.py
——— b.py

b.py调用a.py,此时的查找路径为/home/winycg/pythonproject/A下的AA文件夹中的a.py:

import AA.a
from AA import a

a.py调用b.py,此时的查找路径为/home/winycg/pythonproject下的A文件夹中b:

import A.b
from A import b

b.py调用a.py,a.py调用c.py。此时a.py中的写法与单纯的a.py调用c.py是不同的。此时,a.py传入的是b.py所在的路径:
运行b.py时,可以在a.py中输入一下代码查看当前文件路径:

import os
print(os.getcwd())
Output: ~/A,而不是a.py所在的实际路径~/A/AA

此时使用import c是无法找到模块的,因为查找路径为/home/winycg/pythonproject/A
a.py中正确的导入方式为:

from AA import c
from . import c

也可以通过在sys.path列表中添加路径的方式解决相对导入无法识别的问题:

import sys
sys.path.insert(0, '~/A/AA')
import c

同理,如果A文件夹并不在pycharm的环境中,则库搜索路径为:

['/home/winycg/pythonproject/A',
'/home/winycg/anaconda3/lib/python36.zip', 
'/home/winycg/anaconda3/lib/python3.6', 
'/home/winycg/anaconda3/lib/python3.6/lib-dynload', 
'/home/winycg/anaconda3/lib/python3.6/site-packages']

差别就是有无/home/winycg/pythonproject,可以将A文件夹的上一层文件夹加入到sys.path中,也可使用上述的结论。

猜你喜欢

转载自blog.csdn.net/winycg/article/details/82021728