<p>查看<a href="http://www.python.org/dev/peps/pep-0328/#relative-imports-and-name" rel="noreferrer">PEP 328</a>中的以下信息:</p>
<blockquote>
<p>Relative imports use a module's <code>__name__</code> attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to <code>'__main__'</code>) then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.</p>
</blockquote>
<p>当您以脚本的形式运行<code>foo.py</code>时,该模块的<code>__name__</code>是<code>'__main__'</code>,因此不能执行相对导入。即使<code>mypackage</code>在<code>sys.path</code>上,这也是正确的。基本上,只有在导入模块时,才能从该模块进行相对导入。</p>
<p>以下是解决此问题的两个选项:</p>
<p>1)在<code>foo.py</code>中,检查<code>__name__ == '__main__'</code>是否,并有条件地将<code>mypackage</code>添加到<code>sys.path</code>:</p>
<pre><code>if __name__ == '__main__':
import os, sys
# get an absolute path to the directory that contains mypackage
foo_dir = os.path.dirname(os.path.join(os.getcwd(), __file__))
sys.path.append(os.path.normpath(os.path.join(foo_dir, '..', '..')))
from mypackage import bar
else:
from .. import bar
</code></pre>
<p>2)始终使用<code>from mypackage import bar</code>导入<code>bar</code>,并以自动可见<code>mypackage</code>的方式执行<code>foo.py</code>:</p>
<pre><code>$ cd <path containing mypackage>
$ python -m mypackage.foo.foo
</code></pre>