<p>正如<a href="https://stackoverflow.com/a/65407608/13616163">@Wàlid Bachri</a>所说的,您应该开始放置<code>__init__.py</code>文件,但这比。
您必须将这些<code>__init__.py</code>文件放在每个目录中。所以看起来像这样</p>
<pre><code>.
└── mypackage A
├── __init__.py # here under A
├── subpackage_1
| ├── __init__.py
│ ├── test11.py
│ └── test12.py
├── subpackage_2
| ├── __init__.py # under package 2
│ ├── test21.py
│ └── test22.py
└── subpackage B
├── __init__.py # under package B
├── test31.py
└── test32.py
</code></pre>
<p>在每个<code>__init__.py</code>文件中,需要导入同一目录中的所有文件。例如,在<code>subpackage B</code>中,您需要这样做</p>
<pre><code>#/subpackage B/__init__.py
from . import test31
from . import test32
</code></pre>
<p>在<code>mypackage A</code>中,没有文件,只有目录,您也可以做同样的事情(<code>from . import subpackage_2</code>等等)</p>
<p>如果我假设<code>mypackage A</code>是“<strong>主</strong>”包(如您的diargam所示),那么它不是子模块,要运行任何文件,您将需要执行以下操作</p>
<p>首先<code>cd</code>到<code>mypackage A</code>的<strong>父目录</strong>,然后</p>
<pre><code># Suppose you want to execute /subpackage_1/test11
python -m mypackage_A.subpackage_1.test11 # WARNING mypackage A should have no whitespace
</code></pre>
<p>你可能会收到一封关于你的<code>RuntimeWarning</code>被修改的<code>sys.modules</code>的邮件,但根据经验,我可以向你保证,你可以放心地忽略它。这就是pip的python模块通常是如何完成的,以确保推送到生产环境是容易的</p>
<p><strong>编辑</strong>:还要注意的是,在所有文件中,都应该切换到包导入进行相对导入,因此必须使用点语法</p>
<pre><code>from . import test32 # this will import .test32
</code></pre>
<p>如果您改为从<code>test31</code>到<code>import test32</code>,interpeter将尝试搜索名为<code>test32</code>的全局包,而不是在同一目录中查找</p>