【问题标题】:Automatic discover of Python subpackages in setup.py自动发现 setup.py 中的 Python 子包
【发布时间】:2019-05-18 17:10:24
【问题描述】:

我的项目结构如下:

project_dir
├── my_package
│   ├── subpackage
│   │   ├── bar.py
│   │   └── __init__.py
│   ├── foo.py
│   └── __init__.py
├── not_wanted_package
│   ├── other.py
│   └── __init__.py
└── setup.py

我想创建包含my_package(及其所有子包)的 Python 包,但不是not_wanted_package。使用python3 setup.py sdist bdist_wheel

以下setup.py 工作正常:

from setuptools import setup
setup(
        name='my_package',
        version='1.0',
        packages=['my_package', 'my_package.subpackage']
)

但是当我添加/删除/重命名任何子包时,我将不得不手动更新这个文件。我可以使用setuptools 提供的功能,但find_packages() 发现所有包(包括not_wanted_package)。另一方面,find_packages('my_package') 仅发现 subpackage

有没有什么方法可以使用find_packages()find_namespace_packages()自动发现my_package它的子包?

【问题讨论】:

    标签: python setuptools setup.py


    【解决方案1】:
    from setuptools import setup, find_packages
    
    setup(
        …
        packages=find_packages(include=['my_package']),
        …
    )
    

    find_packages 中使用关键字include 时,仅包含此类包。包括not_wanted_package 在内的所有其他软件包均未列出。

    或者你可以用exclude=['not_wanted_package']排除它

    【讨论】:

      【解决方案2】:

      find_packages 支持根据documentation 排除包。如果这还不够,您仍然可以简单地使用find_packages,但根据排除包的静态列表过滤输出。 setup.py 是一个标准的 Python 文件,这意味着向其中添加您自己的代码不是问题。

      from setuptools import find_packages
      
      def filter_packages(...):
          ...
      
      setup(
          ...
          packages=filter_packages(find_packages("src")),
          ...
      )
      

      如果您的问题仅在于发现所有包而不仅仅是子包,那么请查看werkzeug 使用的文件结构是什么样的。存储库的组织方式旨在消除find_packages 的问题。如您所见,存储库中的werkzeug 目录被放置在一个额外的src 目录中,有效地使其成为src/werkzeug

      https://github.com/pallets/werkzeug/blob/c6dfc4880328fe9c4558d2b2e2325761f4e17f58/setup.py#L51

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 2017-08-09
        • 2019-06-23
        • 2019-01-03
        • 1970-01-01
        相关资源
        最近更新 更多