gpt4 book ai didi

快速了解Python相对导入

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章快速了解Python相对导入由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、绝对导入和相对导入 。

绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等.

相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别.

例1:有以下目录 。

?
1
2
3
4
app /
     __init__.py
     mod.py
     string.py

mod.py内容:import string 。

当在app/目录下执行Python mod.py时为绝对导入,当在app上层目录执行python -m app.mod时为相对导入.

2、在python 2.7及之前版本中默认是先“相对”后“绝对”的顺序搜索模块,也就是说先在模块所在同一个包内搜索然后在sys.path中搜索.

在上例中,在app上层目录执行python -m app.mod时,将导入app/string.py(可以在string.py中print或者在mod.py中加入print string.__file__来测试).

使用以下语句将会只搜索绝对路径:

from __future__ import absolute_import 。

在mod.py开头加上该语句,在app上层目录执行python -m app.mod时,将导入标准库中的string模块.

在python3.3中默认只搜索绝对路径,要使用相对导入,执行以下语句:

from . import string 。

注意:开头点号只能用在from语句中,不能用在import语句中.

3、相对导入使用模块的__name__属性来决定模块在包结构中的位置。当__name__属性不包含包信息(i.e. 没有用'.'表示的层次结构,比如'__main__'),则相对导入将模块解析为顶层模块,而不管模块在文件系统中的实际位置.

例2:

?
1
2
3
4
5
6
7
8
app /
     __init__.py
     sub1 /
          __init__.py
          mod1.py
      sub2 /
          __init__.py
          mod2.py

尝试在mod1.py导入mod2.py,加入from ..sub2 import mod2.

直接在sub1目录下执行python mod1.py或在app目录下执行python sub1/mod1.py将报错:"Attempted relative import in non-package".

在app目录下执行python -m sub1.mod1也将报错:"Attempted relative import beyond toplevel package".

正确的做法是:在app上层目录执行python -m app.sub1.mod1,或者不要使用from ..sub2 import mod2而改用其他方式(比如将sub2添加到sys.path).

例3:

?
1
2
3
4
5
6
__init__.py
start.py
parent.py
sub /
     __init__.py
     relative.py

start.py中包含import sub.relative,relative.py中包含from .. import parent.

执行python start.py将报错:"Attempted relative import beyond toplevel package".

解决办法:新建pkg目录,将parent.py、sub目录移到pkg目录中,start.py改为import pkg.sub.relative,其它不变.

总结 。

以上就是本文关于快速了解Python相对导入的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。

原文链接:http://blog.csdn.net/mingzznet/article/details/53326194 。

最后此篇关于快速了解Python相对导入的文章就讲到这里了,如果你想了解更多关于快速了解Python相对导入的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com