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

Dro*_*ror 16 python python-2.7

我试图在python中设置一个包含子包的包.这是我目前的树形结构:

myPackage
??? __init__.py
??? mySubPackage1
?   ??? foo2.py
?   ??? foo.py
?   ??? __init__.py
??? mySubPackage2
?   ??? bar2.py
?   ??? bar.py
?   ??? __init__.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)

一切__init__.py都是空的.这是我的setup.py:

from distutils.core import setup

if __name__ == "__main__":
    setup(
        name='myPackage',
        package_dir = {
            'mySubPackage1': 'mySubPackage1',
            'mySubPackage2': 'mySubPackage2'},
        packages=['mySubPackage1', 'mySubPackage2'],
    )
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行python setup.py installmyPackage,包安装到dist-packages:

/usr/local/lib/python2.7/dist-packages/mySubPackage1
/usr/local/lib/python2.7/dist-packages/mySubPackage2
Run Code Online (Sandbox Code Playgroud)

我想问题是我的setup.py,但我不知道如何修复它?它应该在父目录中myPackage吗?如果是这样,那么当我将包打包成zip使用时它是如何工作的python setup.py sdist

Max*_*ysh 28

只需使用setuptools而不是distutils,它find_packages完全是为了这个目的:

from setuptools import setup, find_packages

setup(
    name='myPackage',
    packages=find_packages(),
)
Run Code Online (Sandbox Code Playgroud)


Dro*_*ror 10

TL; DR:将包嵌入另一个具有相同名称的包中.

我将超级包嵌套myPackage在一个目录(具有相同名称)中,如下所示:

myPackage
??? myPackage
?   ??? __init__.py
?   ??? mySubPackage1
?   ?   ??? foo1.py
?   ?   ??? foo2.py
?   ?   ??? __init__.py
?   ??? mySubPackage2
?       ??? bar1.py
?       ??? bar2.py
?       ??? __init__.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)

然后,我更新了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']
    )
Run Code Online (Sandbox Code Playgroud)

现在,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
Run Code Online (Sandbox Code Playgroud)

和一个鸡蛋文件.

这几乎是好的.现在它不是平台独立的,因为使用/.为了解决这个问题,我编辑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']
    )
Run Code Online (Sandbox Code Playgroud)

  • 复制 FoxDot 的评论:您像在回复中那样嵌套包是正确的,但如果您的文件夹名称已经对应于子包等,则不需要使用 package_dir 关键字参数指定路径。[此处]( 解释得更好) https://docs.python.org/2/distutils/examples.html#pure-python-distribution-by-package)。 (4认同)