我对python如何知道包中的模块有点困惑。例如,python-pptx
包有一个子模块chart
,其目录结构为
tree /usr/local/lib/python2.7/site-packages/pptx/chart
/usr/local/lib/python2.7/site-packages/pptx/chart
├── __init__.py
├── axis.py
├── category.py
├── chart.py
├── data.py
├── datalabel.py
├── legend.py
├── marker.py
├── plot.py
├── point.py
├── series.py
├── xlsx.py
└── xmlwriter.py
现在如果我
import pptx
并地址chart
为
dir(pptx.chart)
然后是子模块data
和xlsx
丢失
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'__path__',
'axis',
'category',
'chart',
'datalabel',
'legend',
'marker',
'plot',
'point',
'series',
'xmlwriter']
我可以直接pptx.chart.axis
使用dir(pptx.chart.axis)
,但dir(pptx.chart.data)
结果是
AttributeError: 'module' object has no attribute 'data'
如果我发生同样的事情import pptx.chart
但我可以毫无问题地导入pptx.chart.data
。
这里有哪些包导入规则?
预计到达时间
是一个相关的问题,但并没有完全解决我的问题。
正如 Alex Hall 所解释的,这里重新表述,一些包和模块也加载其他包和模块。例如,使用
python modulefinder.py test.py | grep pptx
我发现,除其他外,还加载了以下内容
P pptx.chart /usr/local/lib/python2.7/site-packages/pptx/chart/__init__.py
m pptx.chart.axis /usr/local/lib/python2.7/site-packages/pptx/chart/axis.py
m pptx.chart.category /usr/local/lib/python2.7/site-packages/pptx/chart/category.py
m pptx.chart.chart /usr/local/lib/python2.7/site-packages/pptx/chart/chart.py
m pptx.chart.datalabel /usr/local/lib/python2.7/site-packages/pptx/chart/datalabel.py
m pptx.chart.legend /usr/local/lib/python2.7/site-packages/pptx/chart/legend.py
m pptx.chart.marker /usr/local/lib/python2.7/site-packages/pptx/chart/marker.py
m pptx.chart.plot /usr/local/lib/python2.7/site-packages/pptx/chart/plot.py
m pptx.chart.point /usr/local/lib/python2.7/site-packages/pptx/chart/point.py
m pptx.chart.series /usr/local/lib/python2.7/site-packages/pptx/chart/series.py
m pptx.chart.xmlwriter /usr/local/lib/python2.7/site-packages/pptx/chart/xmlwriter.py
dir
只列出加载的函数,而 aspptx
不加载pptx.data
则不dir
列出它。要找到所有可能加载的模块,必须使用help
help(pptx.chart)
Help on package pptx.chart in pptx:
NAME
pptx.chart
FILE
/usr/local/lib/python2.7/site-packages/pptx/chart/__init__.py
PACKAGE CONTENTS
axis
category
chart
data
datalabel
legend
marker
plot
point
series
xlsx
xmlwriter
而且,如果需要包中的子模块,则应该显式加载它,而不是依赖于它已被其他东西加载的假设。这是我一直在寻找的规则。