用子包设置python包的正确方法

2024-05-20 16:05:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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时,包被安装到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中时,它是如何工作的?


Tags: namepyinitlibpackagesusrlocaldist
2条回答

只需使用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']
    )

相关问题 更多 >