为什么使用:从子包导入项目语句不起作用?

时间:2015-01-13 19:41:40

标签: python python-2.7

我遇到了这个令人困惑的问题:

 \dir0 
   \dir1  #package
      __init__.py 
      \dir2  #sub-package 
       __init__.py 
       module.py

当我使用这个陈述时:

from dir1 import dir2 

然后:

from dir2 import module

它不起作用,但是

from dir1.dir2 import module

作品!

问:这是怎么回事,因为dir2只是一个初始化from __init__ file的命名空间(模块对象)?

2 个答案:

答案 0 :(得分:2)

from dir2不查看当前模块中的本地名称,查看sys.path搜索路径上的目录。

换句话说,您在此处导入dir2并不重要,因为模块的全局命名空间对可导入的内容没有影响。

不以.开头的导入的Python 2规则如下:

  1. 在当前包中查找名称。如果您当前的模块是初始脚本或交互式解释器,则当前没有包。

  2. 依次查看sys.path中指定的每个目录。

  3. 如果您使用from __future__ import absolute_imports,则会完全删除第一个选项,并且仅使用第二个位置。

答案 1 :(得分:0)

由于import语句使用sys.path(指定模块搜索路径的字符串列表),用于导入模块。因为你的dir2中没有sys.path,但你有dir1

和关于点(.python wiki说:

  

包是一种使用“点模块名称”构建Python模块命名空间的方法。例如,模块名称AB在名为A的包中指定名为B的子模块。就像使用模块保存不同模块的作者不必担心彼此的全局变量名一样,使用点模块名称可以保存作者NumPy或Python Imaging Library等多模块软件包不必担心彼此的模块名称。

所以当你使用from dir1.dir2 import module时,python假设dir2dir1的子模块。