相对导入

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,其它不变。

时间: 2024-08-09 00:16:12

相对导入的相关文章

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

自签证书的创建与导入

1.创建根秘钥 openssl genrsa -outca.key 20482.创建根证书 openssl req -new -x509 -days 36500 -sha256 -keyca.key -outopenas.crt -subj "/C=CN/ST=Jiangsu/L=Nanjing/O=HuaweiCA/OU=112.13.167.7"3.创建SSL证书私匙 openssl genrsa -outserver.key 2048位4.建立SSL证书 openssl req

将Excel导入DataGridView 中的"select * from [Sheet1$]"中[ ]里面表单名的动态获取

Sheet1$是Excel默认的第一个表名,如果改动:select * from [Sheet1$]"将查询失败,因此应根据选择自动获取excel表名: 1 OpenFileDialog ofd = new OpenFileDialog(); //选择文件路径 2 ofd.Title = "Excel文件"; 3 ofd.FileName = ""; 4 ofd.Filter = "Excel文件(*.xls)| *.xls"; 5 s

jdbc驱动jar导入eclipse

在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java build path,右边选择libraries 3.选择add External jars 4.选择jar包的按照路径下的确定后就行了. Java连接MySQL的最新驱动包下载地址 http://www.mysql.com/downloads/connector/j 有两种方法导入jar包,第一种

把Excel的数据导入到数据库

将Excel作为数据源,将数据导入数据库,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个package,创建Excel data source component,SSDT会在Connection Managers中创建一个Excel的connection 由于示例Excel的首行是列名,所以需要勾选"First row has column names",Excel connectio

sql server 导入平面文件源数据,错误 0xc02020a1错误 0xc020902a 错误 0xc02020c5,返回状态值 4 和状态文本“文本被截断,或者一个或多个字符在目标代码页...

使用sql server 导入平面文件源数据时,报错:错误 0xc02020a1: 错误 0xc020902a: 错误 0xc02020c5:错误 0xc0047022: 返回状态值 4 和状态文本"文本被截断,或者一个或多个字符在目标代码页中没有匹配项. 错误 0xc02020a1: 数据流任务 1: 数据转换失败.列"列 6"的数据转换返回状态值 4 和状态文本"文本被截断,或者一个或多个字符在目标代码页中没有匹配项.". (SQL Server 导入

(转载)解决AndroidStudio导入项目在 Building gradle project info 一直卡住

源地址http://blog.csdn.net/yyh352091626/article/details/51490976 Android Studio导入项目的时候,一直卡在Building gradle project info这一步,主要原因还是因为被墙的结果.gradle官网虽然可以访问,但是速度连蜗牛都赶不上... 解决办法主要有两种,一是直接下载gradle离线包,二是修改项目的gradle-wrapper.properties里的gradle版本为自己电脑已有的版本. 离线包下载导

python:模块导入之浅认识

(1)python有大量的模块: 1.内部提供的模块:不需要安装,可以直接调用 2.第三方库:包括业内开源的模块和自己开发的,需要安装 (2)什么是pyc文件: pyc文件的pycodeobject的一种持久化保存,而pycodeobject则是python真正编译的结果 明白什么时pyc文件,则我们需要从python的运行过程说起: 1.首先当python程序运行时,编译的结果则是保存在位于内存中的pycodeobject中,当python运行结束时,将pycodeobject写入到pyc文件

已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步代码时,还是提示输入密码?

GitHub虽好,但毕竟在国内访问不是很稳定,速度也不快,而且推送到上面的源码等资料必须公开,除非你给他交了保护费:所以有条件的话,建议大家搭建自己的Git Server.本地和局域网服务器都好,不信你试试,那速度,怎一个爽字了得! 默认情况下,使用TortoiseGit同步代码,每次都需要输入用户名和密码,但为了方便可以在客户端创建ssh密钥,用于服务器端和客户端的认证(详细过程大家可参考这里),但有时会出现“ 已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步

Excel导入导出例子

一键上传 在ssh中上传批量数据表格 1.必须同步提交form表单 2.Form表单编码方式:multipart/form-data 3.提交方式必须为post 4.上传文件对应input type="file" 为导入按钮添加一键上传效果: //为导入添加一键上传 $("#button-import").upload({ action : '../../area_batchImport.action', //在文件选中时,作出校验 onSelect : funct