使用setup.py创建不同的分发类型

时间:2011-11-09 12:10:11

标签: python setuptools setup.py

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

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

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

  1. 仅包含来源的分发

  2. 包含(extrastuff)

  3. 下的源和所有数据文件的分发

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

2 个答案:

答案 0 :(得分: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
        }
    )

答案 1 :(得分: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 module或更新的argparse module

编辑:我还在distutils文档中找到了一个标题为Creating a new Distutils command的部分。这也可能是一个有用的资源。