<p>模块<em>可以</em>循环地相互导入,但有一个陷阱。在简单的情况下,它应该通过将<code>import</code>语句移动到文件的底部或不使用<code>from</code>语法来工作。</p>
<p>这就是为什么这样做的原因:</p>
<p>导入模块时,Python首先检查<code>sys.modules</code>。如果在里面,就从那里进口。如果它不在那里,它会尝试以正常的方式导入它;基本上,它会找到文件并运行其中的内容。</p>
<p>运行模块会填充模块的内容。例如,假设我们有这个模块,创造性地命名为<code>example_opener</code>:</p>
<pre><code>import webbrowser
def open_example():
webbrowser.open('http://www.example.com/')
</code></pre>
<p>开始时,模块是空的。然后Python执行:</p>
<pre><code>import webbrowser
</code></pre>
<p>之后,模块只包含<code>webbrowser</code>。然后Python执行:</p>
<pre><code>def open_example():
webbrowser.open('http://www.example.com/')
</code></pre>
<p>Python创建<code>open_example</code>。现在模块包含<code>webbrowser</code>和<code>open_example</code>。</p>
<p>假设<code>webbrowser</code>包含以下代码:</p>
<pre><code>from example_opener import open_example
def open(url):
print url
</code></pre>
<p>假设<code>example_opener</code>是先导入的。执行此代码:</p>
<pre><code>import webbrowser
</code></pre>
<p>尚未导入<code>webbrowser</code>,因此Python将执行<code>webbrowser</code>的内容:</p>
<pre><code>from example_opener import open_example
</code></pre>
<p><code>example_opener</code><em>已导入,但尚未完全执行。Python不在乎。Python从<code>sys.modules</code>中取出模块。此时,<code>example_opener</code>仍然是空的。它还没有定义<code>open_example</code>,甚至还没有完成导入<code>webbrowser</code>。Python在<code>example_opener</code>中找不到<code>open_example</code>,因此失败。</p>
<p>如果我们从<code>webbrowser</code>结尾导入<code>open_example</code>,从<code>example_opener</code>结尾导入<code>webbrowser</code>,会怎么样?Python将首先执行以下代码:</p>
<pre><code>def open_example():
webbrowser.open('http://www.example.com/')
</code></pre>
<p><code>webbrowser</code>还不存在,但在调用<code>open_example</code>之前这并不重要。现在<code>example_opener</code>只包含<code>open_example</code>。然后执行:</p>
<pre><code>import webbrowser
</code></pre>
<p>它尚未导入,因此Python将执行<code>webbrowser</code>。它开始于:</p>
<pre><code>def open(url):
print url
</code></pre>
<p>它定义了<code>open</code>。然后执行:</p>
<pre><code>from example_opener import open_example
</code></pre>
<p><code>example_opener</code>在<code>sys.modules</code>中,所以它使用它。<code>example_opener</code>包含<code>open_example</code>,因此成功。Python完成导入<code>webbrowser</code>。这就结束了从<code>example_opener</code>导入<code>webbrowser</code>。这是<code>example_opener</code>中的最后一件事,所以<code>example_opener</code>的导入也成功地完成了。</p>