直接导入的包不会自动将子包或子模块放入其命名空间:
>>> import mydir
>>> dir(mydir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
(注意这里没有innerdir
。)
但是如果你通过包导入,Python 会将命名空间连接在一起:
>>> import mydir.innerdir
>>> dir(mydir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'innerdir']
>>> dir(mydir.innerdir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
mymodule
(请注意,中没有mydir.innerdir
。)
__all__
Python 允许您使用 中的魔法变量明确说明要在包中自动包含哪些子模块__init__.py
,但默认情况下它只会在代码中运行__init__.py
代码而不做任何其他事情。
您可以执行以下任何操作:
import mydir.innerdir.mymodule; mydir.innerdir.mymodule.hi()
from mydir.innerdir import mymodule; mymodule.hi()
from mydir.innerdir.mymodule import hi; hi()
或者,您可以编辑__init__.py
文件以包含__all__
用于通配符导入的变量。
# file mydir/innerdir/__init__.py
print 'Running mydir/innerdir/__init__.py'
__all__ = ['mymodule']
然后你可以做这样的事情:
from mydir.innerdir import *; mymodule.hi()
更疯狂的是,您可以急切地导入子包和模块(我不推荐这样做!):
# file mydir/__init__.py
print 'Running mydir/__init__.py'
import innerdir
# file mydir/innerdir/__init__.py
print 'Running mydir/innerdir/__init__.py'
import mymodule
现在这些将起作用:
import mydir; mydir.innerdir.mymodule.hi()
from mydir import innerdir; innerdir.mymodule.hi()
您可能想复习一下packages 的文档,它解释了所有这些,并且具有与您在此处显示的完全一样的目录结构。