Python:导入包含“嵌套”模块的包

8
当我导入模块时,这个嵌套的场景很好用。但是当我尝试导入包时,结果不一致。以下是非常简单的情况:
当前文件夹的内容:
mypackages <directory>
   __init__.py 
   one.py
   two.py
   three.py

这是脚本:

这是脚本:

__init__.py :
import one

one.py :
import two

two.py :
import three

我期望我能够通过这种方式访问23
import mypackages
mypackages.one.two
mypackages.one.two.three

换句话说,逻辑层应该是这样的:
one
  two
    three

但是当我执行import mypackages时,所有模块都会在同一个级别上暴露:

>>> import mypackages
>>> print dir(mypackages)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 
'__path__', 'one', 'three', 'two']

它应该只显示一个模块,对吧?我感到困惑的是它显示了所有的 one, twothree,这意味着它们处于同一级别(我可以直接使用 mypackages.twomypackages.three)。

有人能解释一下吗?

1个回答

13

你应该阅读这个链接

将文件放置在同一级别,就将它们放置在相同的包级别中。 在你的情况下,你需要得到这样的架构:

mypackage
├── __init__.py
├── one.py  # contains "import two"
└── two
    ├── __init__.py
    ├── two.py  # contains "import three"
    └── three
        ├── __init__.py
        └── three.py

然后,您可以使用以下方式访问包:

import mypackage.one
import mypackage.one.two
import mypackage.one.two.three

能否扩展一下,涵盖从子包中使用函数和类的用法? - akinuri
你的意思是如何访问模块对象的成员? - aluriak
是的。我尝试了建议的解决方案,但无法使其工作。在一个目录中,我有一个名为intl的文件夹,其中包含一个文件(scanner.py),并希望将其转换为包。在主文件中,执行import intlscanner = intl.Scanner()没有起作用。我不得不修改__init__.py并添加from .scanner import Scanner。因此,使用来自包/子包的函数和类的用例将改进此答案,因为它没有提到修改__init__.py的任何内容。虽然我设法让我的脚本工作,但我不知道我是否采取了正确的方法 :) - akinuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接