我正在重构一个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提供的示例和见解。
答案 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()