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/目录下. ...
随机推荐
- WPF图片模糊的解决之路
设计稿转为xaml后,设计师开始review UI了,发现图片都模糊了. 这一张很神奇,三个图片都是同一张,中间的那个最清楚,上面的这个左右两边清楚,下面的那个四个边都不清楚. 这一张,右边是原图,左 ...
- CSS3 transform 引起z-index失效
https://my.oschina.net/u/2941696/blog/1529373
- 通过WireShark抓取iOS联网数据实例分析
本文转载至http://blog.csdn.net/lixing333/article/details/7782539 iosiphone网络filter工具 我在另外一篇博客里,介绍了一款比Wire ...
- C++异常 调用abort()
以一个计算两个数的调和平均数的函数为例.两个数的调和平均数的定义是:这两个数倒数的平均值的倒数,因此表达式为:1.0 * x * y / (x + y)如果y是x的负值,则上述公式将导致被零除——一种 ...
- JS时间格式化函数
Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month & ...
- Androidの共享登录之方案研究
由于最近公司提到了一个需求是,一个应用登录成功了,另一个自动登录. 绞尽脑汁想了好几天,看起来很容易但是想深点就漏洞百出,有的时候代码都写完了测试都成功了突然发现给一个假设就完全失效. 先前几个同事之 ...
- [数据库系列之MySQL]Mysql优化笔记
大型网站提速之MySql优化 数据库优化包括的方面 数据库优化是一个综合性的技术,并不是通过某一种方式让数据库效率提高很多,而是通过多方面的提高,从而使得数据库提高很多. 主要包括: 1.表的设计合理 ...
- 【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36639&extra=page%3D1 爱奇艺地址: http: ...
- 如何学习 cocos2d-x ?
发表于 04/23/2014 作者 zrong — 24 条评论 ↓ 11,687 次查看 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处 ...
- 图片转成base64的字符串, 如何让图片在html中显示
图片在服务端已编码成base64的字符串放在xml里面,客户端接受xml,取得base64的字符串后,请问如何让图片在html中显示? <img src="data:image/png ...