Показаны сообщения с ярлыком argparse. Показать все сообщения
Показаны сообщения с ярлыком argparse. Показать все сообщения

20 декабря 2012 г.

Запускаем 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()

Не очень круто вышло, не находите? А все потому что gunicorn еще использует устаревший optparse для парсинга аргументов с коммандной строки, а там задавать список аргументов в parse_args совсем не обязательно, ведь по дефолту берется список sys.argv[1:].

Так что на таком простом примере лично мне ясно видно, насколько optparse устарел и как вашему приложению, которое его еще использует надо сломя голову переезжать на argparse! И это я еще не рассказал вам о бесподобном управлении под-коммандами в argparse :)

24 июля 2012 г.

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 и забить на optparse as soon as possible.


Примерно похожая на ситуацию с optparse, у меня была ситуация с форматированием строк. Я продолжал грызть кактус использовать синтаксис 'Hello, %s!' % 'world' вместо модного и молодежного 'Hello, {0}!'.format('world'). И опять же пару последних недель расставили все по местам. После окончательного ознакомления со всеми возможностями Format String Syntax, я просто понял, что назад дороги нет! Только format, только так!

И да, ведь встроенная функция format может использоваться не только для форматирования строк, но и для любых других объектов, которые поддерживают метод __format__. Например, сейчас нет необходимости пользоваться strftime для объектов из библиотеки datetime, просто пишем,

format(datetime.date.today(), '%Y-%m-%d')

или даже,

'{:%Y-%m-%d}'.format(datetime.date.today())

и вуаля!


А напоследок скажу, что также в последнее время часто задумываюсь о необходимости изучения Python 3 или хотя бы портирования какого-то своего кода на эту ветку. И как по магии, в своем фиде на GitHub нашел полезную библиотеку six, которая весьма мне пригодится в этом деле. Вот такие вот дела!