В разработке с python немалую роль играет консоль. Запуск сервера, запуск тестов, работа с VCS, развертывание (deployment) и т.д. Есть конечно IDE, которые предлагают много “плюшек”, достаточно сделать всего лишь пару кликов, но это мы прошли.
Дальше поговорим про организацию наших телодвижений в консоли.
Когда я работал в 42cc, в практике у нас было добавление Makefile в проект, куда записывались часто используемые команды, в итоге работа с проектом сводилась к:
make clean make runserver make test make deploy
так сказать псевдонимы, а команды на самом деле были примерно такие:
clean: -rm *~* -find . -name '*.pyc' -exec rm {} \; runserver: PYTHONPATH=$(PYTHONPATH) python django-project/manage.py runserver test: PYTHONPATH=$(PYTHONPATH) nosetests --with-django --django-settings=$(test_settings) $(module)
Но в общем подход по минимизации команд мне нравился. Можно переключиться на проект, посмотреть Makefile и понять что используется. Набирать команды короче. А еще у Makefile зачастую есть поддержка автодополнения, что тоже в повседневной разработке упрощает жизнь.
Потом я услышал про чудо библиотеку для деплоймента fabric и стал ее использовать. Но плодить fabfile.py, Makefile совсем не хотелось. Решил, что если использовать fabric для деплоймента, то почему бы не использовать ее и для частых локальных команд:
from fabric.api import local, run, cd def run(): '''Start development server''' local('PYTHONPATH=. paster serve --reload development.ini', capture=False) def pep8(target='.'): '''Run pep8''' local('pep8 --ignore=E202 %s' % target, capture=False) @hosts('root@pusto.org') def deploy(restart=False): '''Deploy to remote server''' local('hg push', capture=False) with cd('/var/www/horosh/'): run('hg pull&&hg up') if restart: run('/etc/init.d/horosh force-reload')
Работа с консолью опять сводится к коротким командам:
fab clean pep8 fab run fab deploy:True
В fabric мы уже можем передавать параметры при вызове задачи и это клево.
В принципе это не критичные моменты, библиотека делает свое дело. Для разработки на винде, возможно, это лучшее решение, т.к. тут свой ssh клиент paramiko, но я - не на винде :).
Со временем понял, что из fabric мне больше всего нужны функции local и run, а мои методы деплоя простые и не нужна особенность fabric для работы с множеством серверов.
Итак, чтоб сделать local c перехватом вывода и без, нужно всего-то:
from subprocess import call, Popen, PIPE, STDOUT # With capture cmd = Popen('ls -la', shell=True, stdout=PIPE, stderr=STDOUT) print(cmd.communicate()[0]) # Without capture call('ls -la', shell=True)
Теперь можно вспомнить про argparse и его сабкоманды и уже можно создавать свои manage.py на чистой стандартной библиотеке.
А что будем делать с деплоем?
Все просто :) - использовать стандартный клиент ssh.
from subprocess import call commands = '&&'.join(['ls -la', 'uptime']) call('ssh pusto.org "%s"' % commands, shell=True)
Т.е. мы можем делать развертывание проекта при помощи стандартной библиотеки python и клиента ssh, который у меня точно есть под рукой.