<p>TL;DR:将包嵌套在另一个同名的包中。</p>
<p>我将超级包<code>myPackage</code>嵌套在一个目录(同名)中,如下所示:</p>
<pre><code>myPackage
├── myPackage
│ ├── __init__.py
│ ├── mySubPackage1
│ │ ├── foo1.py
│ │ ├── foo2.py
│ │ └── __init__.py
│ └── mySubPackage2
│ ├── bar1.py
│ ├── bar2.py
│ └── __init__.py
└── setup.py
</code></pre>
<p>然后,我更新了<code>setup.py</code>:</p>
<pre><code>from distutils.core import setup
if __name__ == "__main__":
setup(
name='myPackage',
package_dir = {
'myPackage': 'myPackage',
'myPackage.mySubPackage1': 'myPackage/mySubPackage1',
'myPackage.mySubPackage2': 'myPackage/mySubPackage2'},
packages=['myPackage', 'myPackage.mySubPackage1',
'myPackage.mySubPackage2']
)
</code></pre>
<p>现在,<code>sudo python setup.py install</code>的行为如我所料,在<code>dist-packages</code>中,我有以下结构:</p>
<pre><code>myPackage
├── __init__.py
├── __init__.pyc
├── mySubPackage1
│ ├── foo1.py
│ ├── foo1.pyc
│ ├── foo2.py
│ ├── foo2.pyc
│ ├── __init__.py
│ └── __init__.pyc
└── mySubPackage2
├── bar1.py
├── bar1.pyc
├── bar2.py
├── bar2.pyc
├── __init__.py
└── __init__.pyc
</code></pre>
<p>还有一个鸡蛋锉。</p>
<p>这几乎是好的。现在由于<code>/</code>的使用,它不是独立于平台的。为了解决这个问题,我编辑了<code>setup.py</code>,如下所示:</p>
<pre><code>from distutils.core import setup
from distutils import util
if __name__ == "__main__":
pathMySubPackage1 = util.convert_path('myPackage/mySubPackage1')
pathMySubPackage2 = util.convert_path('myPackage/mySubPackage2')
setup(
name='myPackage',
package_dir = {
'myPackage': 'myPackage',
'myPackage.mySubPackage1': pathMySubPackage1,
'myPackage.mySubPackage2': pathMySubPackage2},
packages=['myPackage', 'myPackage.mySubPackage1',
'myPackage.mySubPackage2']
)
</code></pre>