python входные параметры скрипта

Runscript — утилита для запуска python скриптов

Думаю многим знакома следующая ситуация. В вашем проекте есть различные действия, которые нужно выполнять время от времени. Для каждого действия вы создаёте отдельный скрипт на питоне. Чтобы далеко не лазить, скрипт кладёте в корень проекта. Через некоторое время вся корневая директория проекта замусоривается этими скриптами и вы решаете сложить их в отдельную директорию. Теперь начинаются проблемы. Если указать интерпретатору python путь до скрипта, включающий эту новую директорию, то внутри скрипта не будут работать импорты пакетов, находящися в корне проекта т.к. корня проекта не будет в sys.path. Эту проблему можно решить несколькими способами. Можно изменять sys.path в каждом скрипте, добавляя туда корень проекта. Можно написать утилитку для запуска ваших скриптов, которая будет изменять sys.path перед запуском скрипта или просто будет лежать в корне проекта. Можно ещё что-то придумать. Мне надоело каждый раз изобретать колесо и я создал велосипед runscript на котором с удовольствием катаюсь.

Установить библиотеку можно с помощью pip:

После установки библиотеки runscript, вы получаете в вашей системе новую консольную команду run с помощью которой можно запускать скрипты. По-умолчанию, команда run ищет скрипты в под-каталоге script текущего каталога.

Давайте рассмотрим простой пример. Создадим каталог script. Создадим пустой файл script/__init__.py, превратив этот каталог в python-пакет. Теперь создадим файл script/preved.py со следующим содержимым:

Скрипт готов. Теперь мы можем его запустить:

Ура! Скрипт работает. Вот собственно и всё, что делает библиотека runscript. Я серьёзно 🙂 Команда run запускает функцию main из файла, имя которого вы ей передали в командной строке. Оказалось, что даже такой простой фунционал очень удобен. Я с удивлением заметил, что пользуюсь утилиткой run в каждом своём проекте т.к. везде есть простенькие скрипты, которые нужно запускать.

Со временем утилита run обросла рядом полезных полезностей, о которых я сейчас расскажу.

Получение параметров через командную строку

Чтобы передать вашему скрипту какие-либо параметры через командную строку, вам нужно описать эти параметры в функции setup_arg_parser внутри вашего скрипта. Эта функция получает на вход объект ArgumentParser, в который вы можете добавить нужные опции. Далее, когда скрипт будет вызван, значения параметров командной строки будут переданы фунции main. Пример скрипта:

Обратите внимание, как фунция main получила параметры командной строки — в виде обычных именованных параметров. Всегда нужно указывать **kwargs т.к. кроме нужных вам параметров, передаются значения всех глобальных для утитилы run параметров (читайте о них ниже).

Активация Django

Если вы пытались использовать фреймворк Django в ваших консольных скриптах, то знаете, что нужно сделать кое-что, иначе ничего не будет. Кое-что заключается в создании environment переменной DJANGO_SETTINGS_MODULE, cодержащей путь до модуля с настройками. Обычно в python скрипт добавляют следующие строки:

Начиная с django 1.7 нужно также выполнить

Источник

Аргументы командной строки в Python

В этом уроке мы погружаемся в аргументы командной строки в Python. Используя модуль sys, модуль getopt и модуль argparse, мы будем анализировать и читать аргументы.

Обзор

Поскольку Python является таким популярным языком программирования, а также имеет поддержку большинства операционных систем, он стал широко использоваться для создания инструментов командной строки для многих целей. Эти инструменты могут варьироваться от простых приложений CLI до более сложных, таких как AWS’ aws cli tool.

Как правило, аргументы передаются инструментам CLI по-разному, в зависимости от вашей операционной системы:

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

Обработка аргументов командной строки с помощью Python

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

Модуль sys

Печать первого аргумента CLI

В этом первом примере наш скрипт определит способ его вызова. Эта информация хранится в первом аргументе командной строки, индексируемом с 0. Приведенный ниже код показывает, как вы получаете имя вашего скрипта Python.

Сохраните этот код в файле с именем arguments-program-name.py, а затем назовите его, как показано ниже. Выходные данные выглядят следующим образом и содержат имя файла, включая его полный путь:

Как вы можете видеть из второго вызова выше, мы получаем не только имя файла Python, но и полный путь, используемый для его вызова.

Подсчет количества аргументов

Сохраните и назовите этот файл arguments-count.py. Некоторые примеры вызова этого скрипта приведены ниже. Это включает в себя три различных сценария:

Перебор Аргументов

Наш третий пример выводит каждый аргумент, отправленный скрипту Python, за исключением самого имени программы. Поэтому мы перебираем аргументы командной строки, начиная с элемента second list. Напомним, что это индекс 1, так как списки в Python основаны на 0.

Ниже мы называем наш код, который был сохранен в файл arguments-output.py. Как и в нашем предыдущем примере, выходные данные иллюстрируют три различных вызова:

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

Модуль getopt

Как вы, возможно, уже заметили, модуль sys разбивает строку командной строки только на отдельные грани. Модуль Python getopt идет немного дальше и расширяет разделение входной строки проверкой параметров. Основываясь на функции getopt C, он допускает как короткие, так и длинные варианты, включая присвоение значения.

Это означает, что эти аргументы являются теми, которые мы считаем действительными, наряду с некоторой дополнительной информацией:

Сам вызов метода хранится в операторе try-catch для покрытия ошибок во время вычисления. Исключение возникает, если обнаружен аргумент, который не является частью списка, как было определено ранее. Скрипт Python выведет сообщение об ошибке на экран и завершит работу с кодом ошибки 2.

Ниже вы можете увидеть результаты выполнения этого кода. Мы покажем, как программа реагирует как с допустимыми, так и с недопустимыми аргументами программы:

Модуль argparse

В приведенном ниже коде показана инициализация парсера, а в приведенном ниже выводе-базовый вызов, за которым следует справочное сообщение. В отличие от вызовов Python, которые мы использовали в предыдущих примерах, имейте в виду использовать Python 3 с этими примерами.

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

Вывод

Источник

Разработка надёжных Python-скриптов

Python — это язык программирования, который отлично подходит для разработки самостоятельных скриптов. Для того чтобы добиться с помощью подобного скрипта желаемого результата, нужно написать несколько десятков или сотен строк кода. А после того, как дело сделано, можно просто забыть о написанном коде и перейти к решению следующей задачи.

Если, скажем, через полгода после того, как был написан некий «одноразовый» скрипт, кто-то спросит его автора о том, почему этот скрипт даёт сбои, об этом может не знать и автор скрипта. Происходит подобное из-за того, что к такому скрипту не была написана документация, из-за использования параметров, жёстко заданных в коде, из-за того, что скрипт ничего не логирует в ходе работы, и из-за отсутствия тестов, которые позволили бы быстро понять причину проблемы.

python входные параметры скрипта

При этом надо отметить, что превратить скрипт, написанный на скорую руку, в нечто гораздо более качественное, не так уж и сложно. А именно, такой скрипт довольно легко превратить в надёжный и понятный код, которым удобно пользоваться, в код, который просто поддерживать как его автору, так и другим программистам.

Исходный код

Вот исходный код Python-скрипта, который позволяет решить задачу:

Поговорим о том, как его улучшить.

Документация

Я считаю, что полезно писать документацию до написания кода. Это упрощает работу и помогает не затягивать создание документации до бесконечности. Документацию к скрипту можно поместить в его верхнюю часть. Например, она может выглядеть так:

В первой строке даётся краткое описание цели скрипта. В оставшихся абзацах содержатся дополнительные сведения о том, что именно делает скрипт.

Аргументы командной строки

Следующей задачей по улучшению скрипта станет замена значений, жёстко заданных в коде, на документированные значения, передаваемые скрипту через аргументы командной строки. Реализовать это можно с использованием модуля argparse. В нашем примере мы предлагаем пользователю указать диапазон чисел и указать значения для «fizz» и «buzz», используемые при проверке чисел из указанного диапазона.

Модуль argparse — это весьма мощный инструмент. Если вы с ним не знакомы — вам полезно будет просмотреть документацию по нему. Мне, в частности, нравятся его возможности по определению подкоманд и групп аргументов.

Логирование

Если оснастить скрипт возможностями по выводу некоей информации в ходе его выполнения — это окажется приятным дополнением к его функционалу. Для этой цели хорошо подходит модуль logging. Для начала опишем объект, реализующий логирование:

Добавим в код проекта следующую функцию для настройки логирования:

Основной код скрипта при этом изменится так:

Тесты

Модульные тесты — это полезнейшее средство для проверки того, ведёт ли себя приложения так, как нужно. В скриптах модульные тесты используют нечасто, но их включение в скрипты значительно улучшает надёжность кода. Преобразуем код, находящийся внутри цикла, в функцию, и опишем несколько интерактивных примеров её использования в её документации:

Проверить правильность работы функции можно с помощью pytest :

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

Модульные тесты можно писать и в виде обычного кода. Представим, что нам нужно протестировать следующую функцию:

В конце скрипта добавим следующие модульные тесты, использующие возможности pytest по использованию параметризованных тестовых функций:

Если произойдёт ошибка — pytest даст полезные сведения о том, что случилось:

Итоги

Сделать Python-скрипты надёжнее можно, выполнив следующие четыре шага:

Вокруг этого материала развернулись интересные обсуждения — найти их можно здесь и здесь. Аудитория, как кажется, хорошо восприняла рекомендации по документации и по аргументам командной строки, а вот то, что касается логирования и тестов, показалось некоторым читателям «пальбой из пушки по воробьям». Вот материал, который был написан в ответ на данную статью.

Уважаемые читатели! Планируете ли вы применять рекомендации по написанию Python-скриптов, данные в этой публикации?

Источник

Простое руководство по аргументам командной строки Python

Dec 25, 2019 · 5 min read

python входные параметры скрипта

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

Библиот е ка Python argparse была выпущена как часть стандартной библиотеки вместе с Python 3.2. После этого релиза в силу своей популярности она была интегрирована в Python 2.7 и во все будущие версии Python, быстро став золотым стандартом для работы с аргументами командной строки. Она предоставляет следующие функции:

Проведем небольшую экскурсию по библиотеке argparse Python.

Начальная установка

Откройте пустой сценарий Python. Библиотека argparse встроена в Python, соответственно процедура установки не потребуется. На фрагменте кода ниже показано, как создать начальную установку для argparse:

В этом коде есть 3 важных компонента:

На втором этапе мы создаем объект parser, с помощью которого можно добавлять аргументы командной строки вместе с опциями для каждого из них. На третьем этапе запускается функция, которая извлекает введенные пользователем аргументы из командной строки.

Простые варианты использования аргументов командной строки

Продвинутые варианты использования и советы

Настало время двигаться дальше и перейти к продвинутому argparse!

Мы также можем установить так называемые взаимоисключающие группы, определяющие набор аргументов командной строки парсера, которые не могут быть переданы одновременно.

Вот и все! Вы прошли простое руководство по аргументам командной строки Python.

Источник

Python: конфигурация проекта без боли

Расскажу о проделанном пути, чтобы найти идеальный, для моих целей, инструмент конфигурирования проекта и о создании легковесной библиотеки bestconfig, впитавшей в себя преимущества изложенных подходов.

В статье речь пойдет только о локальных способах хранения настроек, здесь не разбираются случаи загрузки из сети.

Для каждого из перечисленных вариантов есть библиотека на python, приведу примеры самых популярных форматов.

Библиотека dotenv отлично справляется с задачей подгрузки таких файлов. Все переменные сразу попадают в os.environ

Открываем файл из кода

Формат чаще используется для коммуникации между сервисам, например между фронтом и беком, как компактный, но в то же время понятный человеку. Но задать в нем некоторые настройки тоже можно

Осталось только импортировать этот файл там, где он нужен

Все просто, разве нет?

BestConfig

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

Поставил целью уменьшить количество кода чтения конфигов почти до нуля, но в тоже время оставить гибкость и возможность подкрутки под более специфичные задачи. Итак, давайе посмотрим, как импортировать например config.yml

И да, это все, что нужно сделать. Глобальный объект config уже будет содержать все необходимое. А теперь по порядку.

Что происходит при создании Config() :

Запускается поиск файлов, похожих на конфиги: любые комбинации имени conf, config, configuration, setting, settings с расширениями yml, yaml, json, ini, cfg, env в текущей директории и в папках выше, вплодь до корня проекта. Также в хранилище добавляются переменные окружения

Исходя из формата файла производится импорт содержимого

Для самых дотошных

Посмотрим на примерах, в чем же «универсальность» объекта config

Обращение по ключу

Иногда мы хотим быть уверены, что значение принадлежит определенному типу

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

Иногда хочется где-нибудь в самом начале программы или скрипта убедиться, что необходимые переменные заданы, для этого предусмотренна специальная функция

Модификация

Помимо словаря метод insert принимает названия файлов (с абсолютным или относильным путем) любого из поддерживаемых расширений

Кастомизация

По умолчанию Config() делает довольно много всего, с целью быть универсальным, но содежит ряд аргументов, регулирующих это поведение.

Установка

Best practices

Обобщу процесс взаимодействия с конфигами с использованием библиотеки bestconfig.

Статичные настройки, не содержащие ключей лежат в файле config.yml в корне проекта

Файл config.py содержит создает класс Config и выполняет другие настройки (например логгирование, версия проекта, обработка параметров запуска и тд)

В других местах проекта делаем from config import config и используемый нужные данные удобным образом

Резюме

Библиотека создана чтобы максимально упростить распространенную задачу по обращению к файлам настроки, ее основные фичи и особенности:

Поддержка множества форматов файлов

Интерфейс доступа к данным «на любой вкус» (по ключу, через точку, через get и тд)

Маленький вес (примерно 15 кб)

Чистый, типизированный, расширяемый python код на модульной архитектуре

Открытость к изменениям и дополнениям (pull request-ы приветствуются)

Есть и недостатки:

У проекта появляются лишние зависимости. Например вы не используете yaml, однако библиотека подтягивает pyyaml

Теперь, при создании нового sandbox проекта или усложении текущего еще одним видом конфигурационных файлов, вы можете выбрать из своего арсенала еще один инструмент!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *