Spec-Zone.ru › click

Интеграция Setuptools

При написании утилит командной строки рекомендуется писать их в виде модулей, распространяемых с помощью setuptools, вместо использования Unix shebang.

Почему это нужно? Есть несколько причин:

  1. Одна из проблем традиционного подхода заключается в том, что первый модуль, загружаемый интерпретатором Python, имеет неверное имя. Это может показаться незначительной проблемой, но она имеет довольно серьезные последствия.

    Первый модуль называется не своим фактическим именем, а интерпретатор переименовывает его в __main__. Хотя это совершенно допустимое имя, это означает, что если другой фрагмент кода захочет импортировать из этого модуля, он вызовет импорт второй раз под своим истинным именем, и внезапно ваш код импортируется дважды.

  2. Не на всех платформах вещи легко исполняются. В Linux и OS X вы можете добавить комментарий в начало файла (#!/usr/bin/env python) и ваш скрипт работает как исполняемый файл (предполагается, что у него установлен исполняемый бит). Однако это не работает в Windows. Хотя в Windows вы можете ассоциировать интерпретаторы с расширениями файлов (например, чтобы все, заканчивающиеся на .py, выполнялись через интерпретатор Python), вы столкнетесь с проблемами, если захотите использовать скрипт в virtualenv.

    Фактически, выполнение скрипта в virtualenv является проблемой и для OS X, и для Linux. При традиционном подходе вам необходимо активировать весь virtualenv, чтобы использовать правильный интерпретатор Python. Не очень удобно для пользователя.

  3. Основной трюк работает только если скрипт является модулем Python. Если ваше приложение слишком велико, и вы захотите использовать пакет, вы столкнетесь с проблемами.

Введение

Для объединения вашего скрипта с setuptools вам нужен только скрипт в пакете Python и файл setup.py.

Представьте себе следующую структуру каталогов:

yourscript.py
setup.py

Содержание файла yourscript.py:

import click

@click.command()
def cli():
    """Example script."""
    click.echo('Hello World!')

Содержание файла setup.py:

from setuptools import setup

setup(
    name='yourscript',
    version='0.1.0',
    py_modules=['yourscript'],
    install_requires=[
        'Click',
    ],
    entry_points={
        'console_scripts': [
            'yourscript = yourscript:cli',
        ],
    },
)

Магия заключается в параметре entry_points. Обратитесь к полному спецификации entry_points для получения более подробной информации. Под console_scripts, каждая строка определяет одну консольную утилиту. Первая часть перед знаком равенства (=) - это имя генерируемой утилиты, вторая часть - путь импорта, за которым следует двоеточие (:) с командой Click.

Вот и все.

Тестирование скрипта

Чтобы протестировать скрипт, вы можете создать новую virtualenv, а затем установить свой пакет:

$ python3 -m venv .venv
$ . .venv/bin/activate
$ pip install --editable .

После этого ваша команда должна быть доступна:

$ yourscript
Hello World!

Скрипты в пакетах

Если ваш скрипт растет, и вы хотите переключиться на хранение вашего скрипта в пакете Python, необходимые изменения минимальны. Предположим, ваша структура каталогов изменилась на следующую:

project/
    yourpackage/
        __init__.py
        main.py
        utils.py
        scripts/
            __init__.py
            yourscript.py
    setup.py

В этом случае вместо использования py_modules в вашем файле setup.py вы можете использовать packages и автоматическую поддержку поиска пакетов setuptools. Кроме того, рекомендуется включать и другие данные пакета.

Вот измененное содержимое файла setup.py:

from setuptools import setup, find_packages

setup(
    name='yourpackage',
    version='0.1.0',
    packages=find_packages(),
    include_package_data=True,
    install_requires=[
        'Click',
    ],
    entry_points={
        'console_scripts': [
            'yourscript = yourpackage.scripts.yourscript:cli',
        ],
    },
)

© Copyright 2014 Pallets.
Licensed under the BSD 3-Clause License.
We are not supported nor endorsed by Pallets.
https://click.palletsprojects.com/en/8.1.x/setuptools/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API