Python没有看到我的子包

时间:2012-05-24 13:04:56

标签: python module package

如果我想使用它们,为什么必须导入所有子包呢? 我将用一个例子来解释自己:

In [1]: import cime

In [2]: cime.runners
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/miki/testit/<ipython-input-2-35e09c66121a> in <module>()
----> 1 cime.runners

AttributeError: 'module' object has no attribute 'runners'

In [3]: import cime.runners

In [4]: cime.runners
Out[4]: <module 'cime.runners' from '/home/miki/testit/venv/lib/python2.7/site-packages/cime/runners/__init__.pyc'>

正如您所看到的那样,它是一个常规的Python包:

In [5]: cime.__file__
Out[5]: '/home/miki/testit/venv/lib/python2.7/site-packages/cime/__init__.pyc'

In [6]: ls /home/miki/testit/venv/lib/python2.7/site-packages/cime
download.py   __init__.py   log.py   runners/  run.pyc   utils.pyc
download.pyc  __init__.pyc  log.pyc  run.py    utils.py

但内置模块不会发生这种情况。为什么呢?

In [7]: import os  # instead of import os.path

In [8]: os.path
Out[8]: <module 'posixpath' from '/home/miki/testit/venv/lib/python2.7/posixpath.pyc'>

谢谢,
魔方

P.S。我在一个虚拟人物中,但我不知道这是否重要。

2 个答案:

答案 0 :(得分:2)

这是cime(无论是什么)开发人员的设计决策。包不会神奇地导入其所有子包。这是一件好事,因为像SciPy这样的大型软件包需要永远导入(就像NLTK一样)。

某些软件包(如os.path,NumPy和NLTK)将导入子模块,但它们会明确地这样做。如果您希望在自己的模块中执行此操作,请执行

# __init__.py
import .submodule

答案 1 :(得分:1)

os.path是与实现细节相关的异常。 Python通常会保守它将要做多少工作,所以它只导入你实际要求的模块。因为os.path的实际实现非常依赖于您的操作系统,所以python会计算出您需要的实现,并在python启动时将其作为os.path导入。

通过在cime/__init__.py

中添加一些额外的导入功能,您可以获得非常相似的效果
from cime import runners

等等。