Python 看不到我的子包

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

谢谢,
魔方

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

最佳答案

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

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

# __init__.py
import .submodule

关于Python 看不到我的子包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738064/

相关文章:

Python 无法向浏览器提供 mp4

javascript - 使用通配符(如 'includes')从 module.exports 对象数组中检索值

node.js - 在 Node.js 中使用 Underscore 模块

package - 仅在未安装时安装 Racket 软件包

java - Package By Feature 和 SONAR 表示依赖循环

python - 阅读文件中的 Nose 测试参数,尤其是@attr

Python正则表达式查找目录路径(\\\\Location\\Location\\Location)

python - 浮点精度仍应给出正确的结果

python - 解析 XML 异常

php - 从 Laravel 中删除包