<p>当您从一个目录启动python时,该目录会被添加到您的<code>PYTHONPATH</code>中,这样模块就可以从该目录及以下目录导入,前提是每个目录中都有一个<code>__init__.py</code>,包括运行python的顶层。请看这里:</p>
<p><code>
~/Development/imports $ tree
.
├── __init__.py
├── mod1
│ ├── __init__.py
│ ├── a.py
├── mod2
│ ├── __init__.py
│ ├── b.py
├── top.py
</code></p>
<p>因此,当我们从<code>~/Development/imports/</code>启动python时,我们可以访问<code>top</code><code>mod1.a</code>和{<cd7>}:</p>
<pre><code>~/Development/imports $ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import top
>>> import mod1.a
>>> import mod2.b
>>> import sys
</code></pre>
<p>但是当我们从<code>mod1</code>内部启动python时,我们不允许从<code>mod1</code>外部返回<code>top</code>或{<cd11>}:</p>
^{pr2}$
<p>相对导入<code>from ..mod2 import b</code>只能从您开始的顶层模块下面的模块中工作,因为它们都隐式地位于python路径中。在</p>
<p>除非将特定路径添加到<code>PYTHONPATH</code>或<code>sys.path</code>,否则无法从开始的模块的</em>外部转义:</p>
<pre><code>~/Development/imports/mod1 $ PYTHONPATH=../ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> import top
>>> import top.mod2.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mod2.b
>>> import sys
>>> sys.path.append('~/Development/imports/mod2/')
>>> from mod2 import b
>>>
</code></pre>
<p>因此,您需要确保所有目录中都有一个<code>__init__.py</code>文件。您还需要确保从正确的位置(通常是顶层目录)启动python。您不能在目录结构的一半位置启动python,然后期望返回到顶部,或者侧向到另一个目录/模块。在</p>