Посты с тэгом argparse


Два с половиной приема при работе с argparse



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

  1. Вызов определенной функции в ответ на заданный параметр командной строки с лаконичной диспетчеризацией.
  2. Инкапсуляция обработки и валидации введенных пользователем данных.

Что там еще за пол-приема?


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


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


Запускаем gunicorn из Python'а

Иногда бывает надо запустить gunicorn внутри Python скрипта, например, в manage.py. Конечно всегда можно воспользоваться subprocess.call:

import subprocess


app = 'package.module:app'
host, port = '0.0.0.0', 8000
subprocess.call('gunicorn -b {}:{:d} -w 4 {}'.format(host, port, app))

Но как-то это не комильфо подумал я и решил найти более труЪ-способ :)

Решение пришло не сразу, но пришло, надо всего лишь переопределить sys.argv и вызвать метод run,

import sys

from gunicorn.app.wsgiapp import run


app = 'package.module:app'
host, port = '0.0.0.0', 8000
sys.argv = [
    sys.argv[0],
    '-b', '{}:{:d}'.format(host, port),
    '-w', '4',
    app
]
run()

Не очень круто вышло, не находите? А



argparse, format и six или мои маленькие радости

Скажем прямо, optparse был хорошим решением для Python 2.3, когда в нем была только обертка над getopt. Но время шло и народ требовал нового решения, составлял PEP'ы и наконец принимал argparse в состав Python 2.7+. Однако на argparse я пересаживался долго. Вот прошло уже больше года с моего окончательного перехода на 2.7 ветку, а я все пытался парсить опции и аргументы, приходящие в Python-скрипт, при помощи optparse. Последние пару недель меня убедили что очень зря! С argparse я теперь могу разбирать не только опции, но и аргументы. Никакого больше,

parser = OptionParser(...)
...
options, args = parser.parse_args()

только,

parser = ArgumentParser(...)
...
args = parser.parse_args()


[Из песочницы] Argparse — парсим аргументы и параметры командной строки с легкостью

Начиная с версии Python 2.7, в набор стандартных библиотек была включена библиотека argparse для обработки аргументов (параметров, ключей) командной строки. Хотелось бы остановить на ней Ваше внимание.
Читать дальше →



Частотный анализатор на Python, часть 2: консольный интерфейс на argparse

В статье Частотный анализатор на Python, часть 1: счастье в библиотеке была разработана простейшая программа, которая подсчитывала количество словоупотреблений во входном файле и записывала в другой файл слова в порядке частоты использования.

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

Хотелось бы, чтобы работа со скриптом (вывод частоты, 1 слово на строку в file_result, текст из file1, file2) выгляде