Python 3 - 将子包子模块名称导入顶层包

时间:2017-03-05 13:11:28

标签: python python-3.x

我有一个包含以下包结构的Python回购:

inttools/
├── LICENSE
├── README.md
├── __init__.py
├── complex
│   ├── __init__.py
│   └── complex.py
├── divisors
│   ├── __init__.py
│   └── divisors.py
├── primes
│   ├── __init__.py
│   └── primes.py
├── sequences
│   ├── __init__.py
│   ├── champernowne.py
│   ├── collatz.py
│   ├── general.py
│   └── ulam.py
├── special_numbers
│   ├── __init__.py
│   ├── hilbert.py
│   └── polygonal.py
├── special_sets
│   ├── __init__.py
│   ├── cyclic.py
│   └── polygonal.py
└── utils
    ├── __init__.py
    └── utils.py

在每个子包__init__.py中,我使用from .<submodule name> import *导入子模块名称,例如在utils.__init__.py我们有

from .utils import *

现在在主程序包inttools.__init__.py中我按以下方式导入所有子包子模块名称:

from utils import *
from primes import *
...
...

这个想法是,当导入inttools包时,包名称空间中的所有子包子模块名称都可用,但是这会失败。例如,在iPython中我cdintttools所在的目录(/Users/srm/dev)并执行以下操作。

在[1]中:import inttools

ImportError                               Traceback (most recent call last)
<ipython-input-1-52c9cc3419fb> in <module>()
----> 1 import inttools

/Users/srm/dev/inttools/__init__.py in <module>()
----> 1 from utils import *
      2 from primes import *
      3 from divisors import *
      4 from complex import *
      5 from sequences import *

ImportError: No module named 'utils'

1 个答案:

答案 0 :(得分:1)

包是inttools,因此子包是inttools.utilsinttools.primes等。

您可以在__init__.py或相对路径(.utils.primes等中使用此绝对路径。)