擅长:python、mysql、java
<p>当您显式地将目录添加到<code>sys.path</code>时,代码可以工作,这一事实是理解发生了什么的关键</p>
<p>由于<em><code>site-packages</code></em>是解释器在导入模块时搜索的位置之一,因此此语句:</p>
<pre><code>from CppProject import sin_impl
</code></pre>
<p>实际上正在<code>CppProject</code>文件夹中搜索名为<code>sin_impl</code>的模块</p>
<p>相反,你应该:</p>
<pre><code>from CppProject.CppProject import sin_impl
</code></pre>
<p>它指向同名的实际模块</p>
<p>实际上,这并不需要在<code>CppProject</code>内部存在<code>__init__.py</code>来将其限定为Python包,因为Python 3.3+实现了隐式命名空间包</p>
<p>但是,当您构建具有许多依赖项的复杂程序时,包构造函数允许您在执行任何常规模块之前添加某种要执行的初始化</p>