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

本文深入解析了Python在不同目录层级下模块的导入机制,包括如何在Pycharm环境下正确配置模块搜索路径,以及如何解决跨目录模块引用的问题。文章详细阐述了在单一目录和平行目录下模块的导入方式,并提供了在复杂目录结构中进行相对导入的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本代码测试实验环境为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中,也可使用上述的结论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值