Создайте разные типы дистрибутивов с помощью setup.py - PullRequest
12 голосов
/ 09 ноября 2011

С учетом следующего (демонстрационного) макета проекта:

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

Как (и где) мне объявлять разные типы рассылки? Особенно мне нужны эти два варианта:

  1. Распределение, содержащее только источник

  2. Дистрибутив, содержащий исходный файл и все файлы данных в (extrastuff)

В идеале, как мне объявить две верхние конфигурации, тогда как вторая зависит от первой?

Ответы [ 2 ]

11 голосов
/ 18 ноября 2011

Я реализовал что-то подобное раньше ... Команда 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
        }
    )
3 голосов
/ 18 ноября 2011

Вы можете расширить файл 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)

Для более тщательного разбора командной строки вы также можете использовать модуль getopt или более новый модуль argparse , если вы ориентируетесь только на Python 2.7 и выше.

РЕДАКТИРОВАТЬ : Я также нашел раздел в документации distutils под названием Создание новой команды Distutils . Это также может быть полезным ресурсом.

...