我正试图在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'],
)
问题是,当我从myPackage
运行python setup.py install
时,sub包被安装到dist-packages
:中
/usr/local/lib/python2.7/dist-packages/mySubPackage1
/usr/local/lib/python2.7/dist-packages/mySubPackage2
我想问题出在我的setup.py
上,但我不知道如何解决它?它应该在myPackage
的父目录中吗?如果是,那么当我使用python setup.py sdist
将包打包到zip
中时,它是如何工作的?
只要使用setuptools
而不是distutils
,它就有find_packages
:
from setuptools import setup, find_packages
setup(
name='myPackage',
packages=find_packages(),
)
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']
)