13

给定以下(演示)项目布局:

MyProject/
    README
    LICENSE
    setup.py
    myproject/
        ... # packages
    extrastuff/
        ... # some extra data

我如何(以及在​​哪里)声明不同的分发类型?特别是我需要这两个选项:

  1. 仅包含源的分发

  2. 包含源文件和所有数据文件的发行版 (extrastuff)

理想情况下,我如何声明上面的两个配置,而第二个依赖于第一个?

4

2 回答 2

11

我之前已经实现过类似的东西......sdist可以扩展命令以处理其他命令行参数并基于这些参数操作数据文件。如果您运行python setup.py sdist --help,它将在帮助中包含您的自定义命令行参数,这很好。使用以下配方:

from distutils import log
from distutils.core import setup
from distutils.command.sdist import sdist

class CustomSdist(sdist):

    user_options = [
        ('packaging=', None, "Some option to indicate what should be packaged")
    ] + sdist.user_options

    def __init__(self, *args, **kwargs):
        sdist.__init__(self, *args, **kwargs)

        self.packaging = "default value for this option"

    def get_file_list(self):

        log.info("Chosen packaging option: {self.packaging}".format(self=self))

        # Change the data_files list here based on the packaging option
        self.distribution.data_files = list(
          ('folder', ['file1', 'file2'])
        )
        sdist.get_file_list(self)

if __name__ == "__main__":

    setup(
        name = "name",
        version = "version",
        author = "author",
        author_email = "author_email",
        url = "url",
        py_modules = [
            # ...
        ],
        packages = [
            # ...
        ],
#        data_files = default data files for commands other than sdist if you wish
        cmdclass={
            'sdist': CustomSdist
        }
    )
于 2011-11-18T09:26:52.573 回答
3

您可以扩展 setup.py 以另外包含一些自定义命令行解析。然后,您可以捕获一个自定义参数并将其剥离,这样它就不会影响setuptools.

您可以在 中访问命令行参数sys.argv。至于修改对 的调用setuptools.setup(),我建议创建一个要传递的参数字典,根据命令行参数修改字典,然后setup()使用**dict符号调用,如下所示:

from setuptools import setup
import sys

basic = {'name': 'my program'}
extra = {'bonus': 'content'}

if '--extras' in sys.argv:
    basic.update(extra)
    sys.argv.remove('--extras')

setup(**basic)

如果您只针对 Python 2.7 及更高版本,您还可以使用getopt模块或更新的argparse模块来进行更彻底的命令行解析。

编辑:我还在 distutils 文档中找到了一个名为“创建新的 Distutils 命令”的部分。这也可能是一个有用的资源。

于 2011-11-18T08:26:00.970 回答