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/目录下. ...
随机推荐
- 学习 TList 类的实现[7]
总结目前 TMyList 已具备的功能(3 个方法.3 个属性): Add: 添加; Delete: 删除; Clear: 清空;Count: 元素总数;Capacity: 已存在的所有元素位置数;L ...
- angular ajax的使用及controller与service分层
一个简单的例子,控制层:.controller('publishController',['$scope','publishService', function($scope,publishServi ...
- 详解MathType中如何插入特殊符号
在论文写作中,经常会用到一些特殊符号,MathType公式编辑器支持插入特殊符号,并且数量繁多,可以满足用户的需求.本教程将详解MathType如何插入特殊符号. MathType中插入特殊符号的操作 ...
- 理解BSTR数据类型 神奇的BSTR
理解BSTR数据类型 神奇的BSTR - 深蓝的日志 - 网易博客 http://blog.163.com/pugood@126/blog/static/13441759320091111115264 ...
- Eclipse的调试功能的10个小窍门
你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...
- day19<异常&File类>
异常(异常的概述和分类) 异常(JVM默认是如何处理异常的) 异常(try...catch的方式处理异常1) 异常(try...catch的方式处理异常2) 异常(编译期异常和运行期异常的区别) 异常 ...
- POJ 1947 Rebuilding Road(树形DP)
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
- js 小数取整,js 小数向上取整,js小数向下取整
js 小数取整,js 小数向上取整,js小数向下取整 >>>>>>>>>>>>>>>>>>& ...
- 最近maven开发中遇到的一些bug。
1.WebxContextLoaderListener 等tomcat启动报错.大部分原因都是jar包问题. 检查方式,在tomcat的webapps/WEB-INF/lib下有没有想对应的jar包 ...
- php检测文件只读、可写、可执行权限
例子:检测文件是否可读.可写.可执行. 复制代码代码示例: <?php $myfile = "./test.txt"; if (is_readable ($myfile)) ...