对于含有 __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__ 是 "__main__",则python会认为该module不在任何package中(即便它在),因为__name__中不包含dot,因此你无法在其文件中使用 .. import,也即无法使用 相对引入,否则你会得到"relative-import in non-package" 错误提示。

python 的 import 使用规则的更多相关文章

  1. Python解释器路径寻找规则

    Python编辑器路径寻址总结 Python编程优化 这场表演邀请了三位角色:run.sh.main.py.path.sh,拍摄场地选在了 Windows -> Git Bash 群演1号 ru ...

  2. python中import和from...import区别

    在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...

  3. Python中import的使用

    python中的import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中. import语句的作用 import ...

  4. python 的import机制2

    http://blog.csdn.net/sirodeng/article/details/17095591   python 的import机制,以备忘: python中,每个py文件被称之为模块, ...

  5. python之import机制

    1. 标准 import        Python 中所有加载到内存的模块都放在 sys.modules .当 import 一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将 ...

  6. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

  7. python的import与from...import的不同之处

    在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...

  8. (原)python中import caffe提示no module named google.protobuf.internal

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5993405.html 之前在一台台式机上在python中使用import caffe时,没有出错.但是 ...

  9. linux环境下 python环境import找不到自定义的模块

    linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...

随机推荐

  1. 设置同样字体大小,chrome浏览器有时字体偏大的解决办法(转)

    本文是找了在网上搜了好久才找到非常棒的一篇文章,很好的解决了这个问题. 原文地址:https://github.com/amfe/article/issues/10 这个特性被称做「Text Auto ...

  2. error:2014 Commands out of sync; you can't run this command now

    如下错误: 分析原因: 前端ajax请求后台,共用同一个链接. 搜索别人的解决方案:http://blog.csdn.net/grass_ring/article/details/3499402 用m ...

  3. javascript在字符串中提取网址并替换成超链接

    var str = " http://wasmip.baidu.com.cn/mip/km/archives/km_archives_main/kmArchivesMain.do?metho ...

  4. 3th January 2014

    I owe my girl so much, i want to pay her, i know this is impossible,but I still try hard.

  5. nginx 杂谈

    http://blog.sina.com.cn/s/articlelist_1834459124_0_1.html

  6. 虚幻4 - ARPG实战教程(第一季)

    在广受欢迎的的<虚幻4高速开发入门>视频教程之后.我收到了许多的反馈,当中大量的同学想要一个实战类的教程.于是,我花了一段时间准备之后,推出了新的一系列实战教程. 希望以深入浅出的方式.解 ...

  7. hdu 4849 最短路 西安邀请赛 Wow! Such City!

    http://acm.hdu.edu.cn/showproblem.php?pid=4849 会有非常多奇怪的Wa的题.当初在西安就不知道为什么wa,昨晚做了,由于一些Sb错误也wa了非常久.这会儿怎 ...

  8. onTouch

    OnTouchOmOnTouchListenerOnTouchEvent View的事件分发 :    对于事件分发机制,举个简单的例子,在一个Activity中只有一个按钮,如果我们想给这个按钮注册 ...

  9. PHP之ob_start()控制缓冲生成html

    输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用. 我们先举一个简单的例子,让大家对Outp ...

  10. 谷歌Volley网络框架讲解——Network及其实现类

    我们看到Network接口只有一个实现类BasicNetwork,而HttpStack有两个实现类. BasicNetwork这个类是toolbox工具箱包里的,实现了Network接口. 先来看下N ...