我遇到了这个令人困惑的问题:
\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
的命名空间(模块对象)?
答案 0 :(得分:2)
from dir2
不查看当前模块中的本地名称,仅查看sys.path
搜索路径上的目录。
换句话说,您在此处导入dir2
并不重要,因为模块的全局命名空间对可导入的内容没有影响。
不以.
开头的导入的Python 2规则如下:
在当前包中查找名称。如果您当前的模块是初始脚本或交互式解释器,则当前没有包。
依次查看sys.path
中指定的每个目录。
如果您使用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假设dir2
为dir1
的子模块。