我正在尝试在python中设置包含子包的包。这是我目前的树形结构:
myPackage
├── __init__.py
├── mySubPackage1
│ ├── foo2.py
│ ├── foo.py
│ └── __init__.py
├── mySubPackage2
│ ├── bar2.py
│ ├── bar.py
│ └── __init__.py
└── setup.py
所有__init__.py
都是空的。这是我的setup.py
:
from distutils.core import setup
if __name__ == "__main__":
setup(
name='myPackage',
package_dir = {
'mySubPackage1': 'mySubPackage1',
'mySubPackage2': 'mySubPackage2'},
packages=['mySubPackage1', 'mySubPackage2'],
)
问题在于,当我从python setup.py install
运行myPackage
时, sub 软件包已安装到dist-packages
中:
/usr/local/lib/python2.7/dist-packages/mySubPackage1
/usr/local/lib/python2.7/dist-packages/mySubPackage2
我猜问题是我setup.py
,但我不知道如何修复它?它应该在myPackage
的父目录中吗?如果是,那么当我使用zip
将包打包到python setup.py sdist
时它是如何工作的?
答案 0 :(得分:21)
只需使用setuptools
代替distutils
,它就是find_packages
完全用于此目的:
from setuptools import setup, find_packages
setup(
name='myPackage',
packages=find_packages(),
)
答案 1 :(得分:7)
TL; DR:将包嵌入另一个具有相同名称的包中。
我将超级包myPackage
嵌套在一个目录(具有相同名称)中,如下所示:
myPackage
├── myPackage
│ ├── __init__.py
│ ├── mySubPackage1
│ │ ├── foo1.py
│ │ ├── foo2.py
│ │ └── __init__.py
│ └── mySubPackage2
│ ├── bar1.py
│ ├── bar2.py
│ └── __init__.py
└── setup.py
然后,我更新了setup.py
:
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']
)
现在,sudo python setup.py install
的行为符合我的预期,dist-packages
我的结构如下:
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
和一个鸡蛋文件。
这几乎是好的。由于/
的使用,它现在不是平台独立的。为了解决这个问题,我编辑了setup.py
,如下所示:
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']
)