<pre><code># Absolute import, works when called directly: python3 package/submoduleA.py
from submoduleB import submoduleBfunction
</code></pre>
<p>因为<code>submoduleA</code>是<code>submoduleB</code>的“兄弟姐妹”,所以这实际上是一个隐式的相对导入。关于他们<a href="https://www.python.org/dev/peps/pep-0008/" rel="nofollow noreferrer">style guide</a>说:</p>
<blockquote>
<p>Implicit relative imports should never be used and have been removed in Python 3.</p>
</blockquote>
<p>当作为脚本运行<code>python3 package/submoduleA.py</code>时,它甚至可以工作的唯一原因是Python将脚本的目录前置到<code>sys.path</code>。从<a href="https://docs.python.org/3/library/sys.html#sys.path" rel="nofollow noreferrer">docs</a>开始:</p>
<blockquote>
<p>As initialized upon program startup, the first item of this list, <code>path[0]</code>, is the directory containing the script that was used to invoke the Python interpreter.</p>
</blockquote>
<p>也就是说,目录<code>/path/to/package</code>被注入<code>sys.path</code>,允许直接导入<code>submoduleB</code></p>
<p>不应该使用隐式相对导入,那么应该使用什么来代替呢?没关系,您可以使用正确的绝对导入形式:</p>
<pre><code>from package.submoduleB import submoduleBfunction
</code></pre>
<p>或相对导入:</p>
<pre><code>from .submoduleB import submoduleBfunction
</code></pre>
<p>只要已将<code>package</code>安装到环境中(安装包就是将代码放入位于<code>sys.path</code>上的<a href="https://stackoverflow.com/questions/122327/how-do-i-find-the-location-of-my-python-site-packages-directory/52638888">site-packages</a>中),这两种方法都可以</p>
<p>如果您必须以脚本形式直接运行<code>package/submoduleA.py</code>,即<a href="https://mail.python.org/pipermail/python-3000/2007-April/006793.html" rel="nofollow noreferrer">considered an anti-pattern</a>,则需要使用绝对导入版本。在这种情况下,相对导入<a href="https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time">do not work</a>。您需要改用<code>python3 -m package.submoduleA</code>,以使相对导入版本正常工作</p>