2016-04-02 68 views
0

考虑到与下面的结构的目录:动态合并与目录模块文件模块在Python

├── foo 
│   ├── bar 
│   │   └── baz.py 
│   └── bar.py 
└── foo.py 

和以下文件内容:

foo.py
class Foo: 
    pass 

富/酒吧.py

class Bar: 
    pass 

富/酒吧/ baz.py

class Baz: 
    pass 

我希望能够做所有这些事情从一些其他的文件:

from foo import Foo 
from foo.bar import Bar 
from foo.bar.baz import Baz 

即仿佛在每个文件中的定义是“合并“模块定义包含具有相同名称的目录。我怎样才能以动态的方式完成这项工作(无论是否涉及到__init__.py或其他),这不需要我手动指定每条路径?

当我把空__init__.py文件在每个目录并尝试执行上述进口,我收到以下错误:

Traceback (most recent call last): 
    File "test.py", line 1, in <module> 
    from foo import Foo 
ImportError: cannot import name 'Foo' 

这似乎给我建议,foo.py文件已被foo覆盖目录,以便foo.py中的定义不可见。

+0

你的意思是你希望你能避免输入'foo.bar.baz'吗?在这种情况下,使用'__init __。py'文件是很容易的。 –

+0

不,我完全按照所示键入输入。我已经更新了这个问题,当我尝试这样做时发生了错误。 –

+0

当我说“以一种动态的方式,不需要我手动指定每个路径”时,我的意思是我不想更新'__init __。py'文件,例如,包括每个文件新的文件/目录我想要这种行为。 –

回答

0

尝试做:

import foo 
print(foo.__file__) 

与你展示我希望得到的结果是这样的文件夹结构:

.../foo.py 

但是当你添加一个__init__.pyfoo文件夹它会取而代之的是:

.../foo/__init__.py 

用python包哟你无法实际导入一个文件夹,以便结束意外事件发生的是,你从该文件夹,而不是foo.py导入__init__.py文件,因此,所有你需要做的是移动foo.py到该文件夹​​和其重命名为__init__.py然后你可以import foofrom foo import Foo与您现在设置的方式相同。

+0

谢谢 - 这很有意义,听起来比尝试手动合并两组不同的定义好得多。 –

+0

我真的希望[文档](https://docs.python.org/3/tutorial/modules.html#packages)描述了'__init __。py'实际上是为了什么,而不仅仅是“__init__”。py可以只是一个空文件,但它也可以执行包的初始化代码或设置\ __ all__变量“** \ __ init__.py文件包含包级变量** –