快速了解Python相对导入
作者:mingz2013 发布时间:2023-07-29 18:35:30
1、绝对导入和相对导入
绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。
相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。
例1:有以下目录
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:
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:
__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,其它不变。
来源:http://blog.csdn.net/mingzznet/article/details/53326194


猜你喜欢
- Tuple 叫做 tuple,用小括号、或者无括号来表述,是一连串有顺序的数字。a_tuple = (12, 3, 5, 15 , 6)an
- 本文实例讲述了Python中pygame的mouse鼠标事件用法。分享给大家供大家参考,具体如下:pygame.mouse提供了一些方法获取
- 1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一
- 环境准备Python3.6pip install Django==2.0.1pip install celery==4.1.0pip ins
- 本文实例讲述了MySQL自定义函数用法。分享给大家供大家参考,具体如下:先来一个简单的,创建一个函数将'2009-06-23 00:
- Django根据已有数据库表反向生成models类一. 创建一个Django项目django-admin startproject ‘xxx
- MySql授权用户权限如何设置首先:去 mysql 库中查看 root 用户的权限select * from user where user
- 今日给大家分享一个Python读取Excel表格,同时采用表格中的数值画图柱状图和折线图,这里只需要几行代码便可以实。首先我们需要安装一个E
- #python中的函数定义,使用和传参###------------------- 必要参数 -----------------------
- 使用云服务器时,我们有时会连接数据库,但在使用Navicat Premium15来连接时,总会遇到报错。常规连接方式,以腾讯云服务器中的My
- 用read_csv读数据遇到分隔符问题的两种解决方式import pandas as pd1.更改read_csv函数中的传参&ld
- caller 属性返回一个对函数的引用,该函数调用了当前函数。functionName.caller functionName 对象是所执行
- 一、题目二、数学求解过程该轮迭代分类结果全部正确,判别函数为g(x)=-2x1+1三、感知器算法原理及步骤四、python代码实现及结果(1
- python可以装在任意的系统盘中,没有强制要求,默认路径是装在C盘。为什么软件默认安装位置是在C盘?下面我们来说一说。首先,需要明确一点,
- 我的是shift+] 会打开search everywhere, 很影响操作。怎么关掉?解决:打开设置(settings)找到keymap,
- 每个存储过程都有默认的返回值,默认值为0。下面我们分别看看在management studio中如何查看输出参数,返回值以及结果集,然后我们
- Python PyTorch深度学习框架PyTorch是一个基于Python的深度学习框架,它支持使用CPU和GPU进行高效的神经网络训练。
- 列表解析——用来动态地创建列表[expr for iter_var in iterable if cond_expr]例子一:map(lam
- 感觉这个东西很常用,很多其它js框架里有,但是太大了,用不了太多,自己写了个。需要的朋友可以参考下。下面是html测试代码:<!DOC
- 官方网站 : www.python.orgPython is an interpreted, interactive, object-ori