<p>任何Python文件都是一个<a href="http://docs.python.org/tutorial/modules.html">module</a>,其名称是文件的基本名称,没有<code>.py</code>扩展名。<a href="http://docs.python.org/tutorial/modules.html#packages">package</a>是Python模块的集合:当模块是一个Python文件时,包是包含一个附加的<code>__init__.py</code>文件的Python模块的目录,用于区分包与刚好包含一堆Python脚本的目录。如果相应的目录包含自己的<code>__init__.py</code>文件,则包可以嵌套到任何深度。</p>
<p>模块和包之间的区别似乎只存在于文件系统级别。当您导入模块或包时,Python创建的相应对象总是<code>module</code>类型。但是,请注意,导入包时,只有该包的<code>__init__.py</code>文件中的变量/函数/类是直接可见的,<em>不是</em>子包或模块。例如,考虑Python标准库中的<code>xml</code>包:它的<code>xml</code>目录包含一个<code>__init__.py</code>文件和四个子目录;子目录<code>etree</code>包含一个<code>__init__.py</code>文件和一个<code>ElementTree.py</code>文件。查看尝试以交互方式导入包/模块时发生的情况:</p>
<pre><code>>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
</code></pre>
<p>在Python中还有一些内置模块,比如用C编写的<code>sys</code>,但是我不认为您打算考虑这些问题。</p>