Подтвердить что ты не робот

Создайте различные типы рассылки с помощью setup.py

Учитывая следующий (демонстрационный) макет проекта:

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

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

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

  • Распространение, содержащее источник и все файлы данных в (extrastuff)

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

4b9b3361

Ответ 1

Я реализовал нечто подобное, прежде чем... команда 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
        }
    )

Ответ 2

Вы можете расширить 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 и выше.

EDIT. Я также нашел раздел в документации distutils под названием Создание новой команды Distutils. Это также может быть полезным ресурсом.