【问题标题】:Python does not see my sub-packagePython 看不到我的子包
【发布时间】:2012-05-31 01:42:14
【问题描述】:

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

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'>

谢谢,
魔方

附:我在 virtualenv 中,但我不知道这是否重要。

【问题讨论】:

    标签: python module package


    【解决方案1】:

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

    一些包,如os.path、NumPy 和 NLTK 会导入子模块,但它们会明确地这样做。如果您希望这发生在您自己的模块中,请执行

    # __init__.py
    import .submodule
    

    【讨论】:

    • 我想说:os.path 是一个例外而不是规则。 import a 在 Python 中并不暗示 import a.bimport a.c
    • 是的,我现在查看了 os.py 源代码,它确实显式地导入了模块。 hg.python.org/cpython/file/290d970c011d/Lib/os.py
    【解决方案2】:

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

    如果你想要的话,你可以通过在 cime/__init__.py 中添加一些额外的导入来获得非常相似的效果

    from cime import runners
    

    等等。

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2020-02-10
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多