python 的 import 使用规则
对于含有 __init__.py 的目录(如adir),其实它就是一个package,它的子目录如果也包含 __init__.py,则只要将 adir 加入 sys.path,则它的字目录就不用加了,python在import的时候会自动遍历所有含有 __init__.py 的子目录。
python文件的引入有2中方式:1、作为顶层执行脚本(执行入口)而加载;2、作为模块被引入。如果你直接执行一个python文件,则它就被当作顶层执行脚本而被加载。如果你使用参数-m (python -m file.py),则该文件被当作模块被引入, 如果该文件被其它文件以import的方式引入,则它也会被当成模块。一个文件的引入方式只能是这两种中的一种,而且某时刻只能是其中一种。
介绍了import,就必须介绍python的naming:
当文件被装载之后,它就会在装载器中获得一个唯一的命名,变量叫做 __name__。如果文件作为顶层执行脚本被引入,则 __name__ == "__main__"。如果作为module被引入,则 __name__ 就是文件的文件名加上一些前缀,这些前缀就是packages/subpackages这样的类似文件路径的东西,不过是由点号dot隔开,而不是/隔开。注意其中的“类似”两字,表明前缀和文件路径不完全一样。比如:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleA.py
如果你引入(即作为模块被引入) moduleX,则它的 __name__ 就是 package.subpackage1.moduleX
,如果你引入moduleA
,则它的 __name__ 就是package.moduleA
。但是如果你直接执行moduleX,则它的 __name__就是 "__main__",如果你直接
执行
moduleA,它的名字就变成了
"__main__",模块名
自动被舍弃。package.moduleA
作为模块引入的时候,__name__ 属性是随引入的方式而不同的。一般有2种方式:被同级目录里的其它文件引用,或经由package而被引用。以上面例子为例,如果被同级目录里的文件引用,则moduleX
的 __name__ 属性为 "moduleX
",而不是 "package.subpackage1.moduleX
"。因为python会将当前目录自动加入search path,它并不知道自己所在的目录是否属于某packge。一个特例是,如果你使用的是交互式python命令行,则该命令行的session的 __name__ 属性为
。"__main__"
因此,综上所述,你引入一个module的方式(经由同级目录里的其它文件引用,或经由package引用,也即 __name__ 属性的值)是你能否将一个文件module成功引入的关键。
相对引入:
由于python为了保证package作为一个独立的模块,即将它拷贝到别处也不依赖于模块外部的东西而能马上运行,因此相对引入不允许引入package外的任何东西。
因此,相对引入有一下规则:
相对引入是使用module的 __name__ 属性来判定它是否属于一个package或在某package的位置。如果你使用相对引入如 from .. import foo
,则这里的 .. 是告诉python从当前目录开始反向搜索本package去搜索 foo 模块(向本package的顶层回溯两个dot)。以上面的例子为例,如果当前模块的 __name__ 是 package.subpackage1.moduleX
,则 ..moduleA
就意味着将找到 package.moduleA
。为了 ..
import 正确工作,模块的 __name__ 必须拥有相应个数的dot,如 package.subpackage1.moduleX 模块,向左数两个dot,则是package模块
。
如果你当前module的 __name__ 是
,则python会认为该module不在任何package中(即便它在),因为__name__中不包含dot,因此你无法在其文件中使用 .. import,也即无法使用 相对引入,否则你会得到"relative-import in non-package" 错误提示。"__main__"
python 的 import 使用规则的更多相关文章
- Python解释器路径寻找规则
Python编辑器路径寻址总结 Python编程优化 这场表演邀请了三位角色:run.sh.main.py.path.sh,拍摄场地选在了 Windows -> Git Bash 群演1号 ru ...
- python中import和from...import区别
在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
- Python中import的使用
python中的import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中. import语句的作用 import ...
- python 的import机制2
http://blog.csdn.net/sirodeng/article/details/17095591 python 的import机制,以备忘: python中,每个py文件被称之为模块, ...
- python之import机制
1. 标准 import Python 中所有加载到内存的模块都放在 sys.modules .当 import 一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将 ...
- python中import和from...import...的区别
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
- python的import与from...import的不同之处
在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
- (原)python中import caffe提示no module named google.protobuf.internal
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5993405.html 之前在一台台式机上在python中使用import caffe时,没有出错.但是 ...
- linux环境下 python环境import找不到自定义的模块
linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...
随机推荐
- 使用CXF为webservice添加拦截器
拦截器分为Service端和Client端 拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理.分为CXF自带的拦截器和自定义的拦截器 1.Servi ...
- android 过USB-IF測试注意事项及改动
USB IF本身是个自愿性的标志(logo)认证. 使用或贴有USB标志的产品都需接受这项測试.其用意是确保全部USB装置的品质都符合要求.产品接受測试的方法有两种:參加USB- IF赞助的兼容性測试 ...
- php-新特性,生成器的创建和使用
mark 一下~ http://laravelacademy.org/post/4317.html
- ubuntu下code::blocks设置运行窗口为gnome命令行
code::blocks编译运行C++程序(F9)默认出现的运行串口在有鼠标的情况下进行粘贴还是很方便的,只要按下鼠标滑轮,位与剪切板中的数据就能粘贴到运行串口中.但是对于用笔记本而且没有鼠标地童鞋这 ...
- 证书:数字签名和验签&加密和解密
用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...
- 310实验室(六)CMake学习心得
树形结构方式布局. OTL 中每一个文件中的CMakeLists.txt 有不同的作用:按查看文件的先后顺便进行分层理解, 根文件即第一次 中的.txt是 启用 CMAKE_MODULE_PATH模板 ...
- 170801、VM性能调优
最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...
- 170726、常用 Git 命令清单
,下面是我整理的常用 Git 命令清单.几个专用名词的译名如下: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一 ...
- 关于cdn原理(就是内容分发网络)
cdn,我理解其本质就是为了解决距离远产生的速度问题,使用就近的服务. 从中国请求美国一台服务器上的图片.一般比较慢,因为距离这么远,网络传输是存在损耗的,距离越远,传输的时间就越长.一般会看到浏览器 ...
- .NET获取Html字符串中指定标签的指定属性的值
using System.Text; using System.Text.RegularExpressions; //以上为要用到的命名空间 /// <summary> /// 获取Htm ...