如果我想使用它们,为什么必须导入所有子包呢? 我将用一个例子来解释自己:
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。我在一个虚拟人物中,但我不知道这是否重要。
答案 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
等等。