导入*包含子模块

时间:2013-06-06 21:09:19

标签: python python-import

我有一个如下所示的目录结构:

scripts/
    __init__.py
    filepaths.py
    Run.py
    domains/
        __init__.py
        topspin.py
        tiles.py
        hanoi.py
        grid.py

我想说:

from scripts import *

并获取filepaths.py中的内容,但也获取hanoi.py中的内容

__init__.py包含:

__all__ = ['filepaths','Run','domains','hanoi']

我无法弄清楚如何将内部文件包含在该列表中。将河内单独置于其中会出现此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'hanoi'

放置domains.hanoi会收到以下错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'domains.hanoi'

我可以想出的最后一个合理的猜测是将scripts.domains.hanoi置于此错误消息中:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'scripts.domains.hanoi'

如何获取所有列表以包含子目录中的内容?

2 个答案:

答案 0 :(得分:2)

scripts/__init__.py中,__all__之前添加以下内容

from domains import topspin, tiles, hanoi, grid

这会将这些模块添加到命名空间,您可以使用

导入它们
from scripts import *

注意

作为肥皂盒,最好做

之类的事情
from scripts import topspin, tiles, hanoi, grid, filepaths, Run

结束

from scripts import *

因为从现在起6个月后,您可能会在第400行代码中查看hanoi,并想知道如果使用*导入样式,它来自何处。通过明确显示从scripts导入的内容,它可以作为事物来源的提醒。我确信将来有人试图阅读你的代码会感谢你。

答案 1 :(得分:1)

首先在__init__个文件中导入它们。

scripts/__init__.py中,至少导入domains,然后导入scripts/domains/__init__.py导入hanoi等。或者直接在domains.hanoi导入scripts/__init__.py

在不导入这些内容的情况下,scripts/__init__.py模块没有引用nestend包。