无法使用`__init __。py`文件中的`__all__`在python包中加载子包

时间:2013-07-23 20:22:27

标签: python module package init

我想使用最上面的__all__文件中的__init__.py属性加载子包,而不是在那里使用import,但不幸的是,我无法让它工作。

这是一个简化的例子:

我有我的包裹

pdbsr/
     __init__.py*
     ...
     extras/
         __init__.py
         ...

*此星号应突出显示我正在讨论的__init__文件。

所以当我把线放

import extras

进入__init__.py文件,一切正常。当我在解释器中测试模块时,我得到以下响应,这表明模块已成功加载:

>>> import pdbsr
>>> pdbsr.extras
<module 'pdbsr.extras' from '.../site-packages/pdbsr/extras/__init__.pyc'>

在新的python shell中,我用import extras文件替换了__init__.py

__all__ = ["extras"]

我遇到了问题:

>>> import pdbsr
>>> pdbsr.extras
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'extras'
>>> extras
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'extras' is not defined

任何人都知道我要通过__all__加载子包来做什么?

编辑:

我为上面给出的非常糟糕的例子道歉。 所以我最初的想法是我可以简化我的__init__.py文件。 例如,我现在

`from pdbfile.new_pdb import *`
`from pdbfile.[...] import *`
`from pdbfile.[...] import *`

等等。由于每个子包都有很多.py个文件,因此我的__init__文件变得非常庞大。

例如,pdbsr / pdb_file / new_pdb包含类NewPdb(),我可以在解释器中调用

>>> import pdbsr
>>> new = pdbsr.NewPdb()

(我想避免使用其他点符号,例如pdbsr.new_pdb.NewPdb()

1 个答案:

答案 0 :(得分:0)

这不是__all__所做的。 __all__是导入模块时可见的模块成员列表。像以前一样在import文件中使用__init__可能是加载包的最佳方式,除非你有一些特殊原因可以解决这个问题。