支持*导入的Python包结构

时间:2014-04-20 22:00:11

标签: python package project python-import

我正在重构一个python项目,该项目是从更大的一小部分脚本演变而来的。我之前没有想到一个合适的包结构,因此所有脚本都存在于root目录包中。

我试图给项目一个合适的“包”结构,如下所示:

packagename/
    docs/
    packagename/
        __init__.py
        module_data.py
        module_corrections.py
        module_plot.py
        subpackage1/
        subpackage2/
    README.md

我想支持将软件包导入为:

from packagename import *

上一次导入的效果应该是加载一些子模块或子包,还有一些我希望提供的类和函数,而不需要预先添加模块名称。

__all__中使用__init__.py我只能加载子模块或子包。

如何加载,例如来自Data()的{​​{1}}类和来自模块module_data的函数dplot

此外,如何将module_plot导入另一个短名称(例如module_data)?

修改

简答

我想要提供的所有名称都必须在mda 中导入或定义 作为字符串添加到列表__init__.py

感谢@FMc提供的示例和见解。

1 个答案:

答案 0 :(得分:0)

这是一个例子 - 但是,作为一般规则,您不应该使用通配符导入(仅在狭义的情况下,并且仅在您定义__all__时)。

# Directory structure.
.
├── foopack/
│   ├── __init__.py
│   ├── data.py
│   └── plot.py
└── run.py

# foopack/data.py
class Data(object):
    def blah(self):
        print self.x

# foopack/plot.py
def dplot():
    print 'dplot()'

# foopack/__init__.py
# Here we use relative imports and define __all__.
from .data import Data
from .plot import dplot    
__all__ = 'Data dplot'.split()

# A demo script: demo.py
from foopack import *

d = Data()
d.x = 32
d.blah()
dplot()