<p>像VSCode或Pycharm这样的ide对一个项目有自己的假设,并且通常会正确地链接模块,即使最终运行代码的解释器不能做到</p>
<p>找不到<code>project.A.somelib</code>的原因在<code>sys.path</code>输出中是可见的,它提供了python搜索模块的位置。由于<code>'/home/dabljues/projects/project/project'</code>未包含,因此python无法在运行时解析它。在</p>
<hr/>
<h3>快速破解</h3>
<p>您只需手动将路径添加到<code>sys.path</code>,方法是在任何其他导入发生之前在<code>foo.py</code>中运行<code>import sys; sys.insert(0, '/home/dabljues/projects/project/project/')</code>,或者在<code>run.sh</code>之前在shell中运行<code>export PYTHONPATH="${PYTHONPATH}:/home/dabljues/projects/project/project/"</code>。在</p>
<hr/>
<h3>安装项目</h3>
<p>既然看起来您正在开发一个库,那么您还可以使用python提供的机制使库可以共享,从而解决任何导入问题。向项目根添加一个最小的<code>setup.py</code>(即<code>/home/dabljues/projects/project/project/setup.py</code>):</p>
<pre class="lang-py prettyprint-override"><code>from setuptools import setup, find_packages
setup(
name='project',
version='0.1.0',
packages=find_packages('project'),
)
</code></pre>
<p>并以可编辑模式安装项目:</p>
^{pr2}$
<p>这将在您的<code>python3</code>可执行文件的<code>site-packages</code>中放置一个指向项目根的链接,当您使用<code>python3</code>运行任何内容时,都可以访问该根。在</p>
<hr/>
<h3>测试</h3>
<p>我在所有python文件的顶部包含了<code>print(__name__)</code>,以获得一些输出。在</p>
<p><strong>跑步运行.sh不安装软件包:</strong></p>
<pre class="lang-sh prettyprint-override"><code>$ sh run.sh
Traceback (most recent call last):
File "project/C/C/foo.py", line 1, in <module>
from project.A.somelib import somefunc
ModuleNotFoundError: No module named 'project'
</code></pre>
<p><strong>安装后</strong></p>
<pre class="lang-sh prettyprint-override"><code>$ sh run.sh
__main__
project.A.somelib
</code></pre>
<p>如您所见,<code>project.C.C.foo</code>是作为一个脚本执行的,但是它会找到以<code>project</code>开头的所有导入,因为安装了<code>project</code>。在</p>