Monthly Archives: Листопад 2012

pip & virtuaenv

Вирішив коротенько занотувати найновіший метод встановлення пітонячих пакетів. Він дає багато переваг для розробника, бо в випадку коли щось поламалось можна знести все нафіг і почати спочатку. Для Python3 звичайно.

Інтернет зберігає багато інформації про яйця. Яйця застарілі. Як і easy_install. Тому що ще простіше ніж написати easy_install можна написати pip install. setuptools застарілий, замість нього треба використовувати distribute.

Разом з pip радять користуватись virtualenv. Це штука яка дозволить тримати окремий набір пакетів для кожного проекту, тримати їх в довільній директорії, і ставити без прав суперкористувача.

Щоб поставити virtualenv вибираємо каталог в якому він стоятиме, і пишемо:

wget https://raw.github.com/pypa/virtualenv/master/virtualenv.py

Готово! :) Тепер ним можна користуватись.

Для того щоб поставити pip і створити нове середовище наприклад для python3 пишемо:

python3 virtualenv.py env_name # замість env_name можна підставити щось довільне

Що накрутіше, цей скрипт працює і для Python 2, тільки в створеному середовищі ставить setuptools замість distutils.

Після того як він трохи попрацює копіюючи файли, в нас з’явиться каталог env_name. Для того щоб активувати середовище, потрібно перейти в каталог, і запустити bin/activate

bunyk@xubuntyk:~/python$ cd env_name/
bunyk@xubuntyk:~/python/env_name$ source bin/activate
(env_name)bunyk@xubuntyk:~/python/env_name$

Все, тепер в дужках ми бачимо що середовище активовано. Це означає що команди pip і python тепер локальні. pip install можна запускати без sudo.

Наприклад:

(env_name)bunyk@xubuntyk:~/python/env_name$ pip install bpython
downloading blablabla installation blablabla ....
(env_name)bunyk@xubuntyk:~/python/env_name$ which bpython
/home/bunyk/python/env_name/bin/bpython
(env_name)bunyk@xubuntyk:~/python/env_name$ which python
/home/bunyk/python/env_name/bin/python

Як бачимо всі пакети не вилазять за межі створеного їм середовища.

Щоб перейти в нормальний режим роботи, пишемо:

(env_name)bunyk@xubuntyk:~/python/env_name$ deactivate 

І пакетів як і не було, хоча Python на місці:

bunyk@xubuntyk:~/python/env_name$ which bpython
bunyk@xubuntyk:~/python/env_name$ which python
/usr/bin/python

Далі спробую розібратись як створити пакет залежний від httplib2 і зробити так щоб він сам свої залежності ставив.


Filed under: Кодерство Tagged: Python

Відкрити браузер і передати йому html

На роботі часто пишу email розсилки. І перед тим як їх тестувати на живому сервері (і на живих клієнта) ми стараємось тестувати їх в локальних умовах. Раніше для цього в конфігу вмикалась опція яка замінювала адресу отримувача на всіх листах що відправляються на адресу розробника чи тестера, після чого десь на порталі натискалась кнопка, чи з інтерактивної сесії Python запускалась функція яка збирала всі дані для заповнення шаблону, рендерила його і посилала листа.

Але це заморочливо. Тепер я вмію мокати smtplib і листи почнуть покриватись тестами. І тоді вже почнеться повне TDD і всім буде добре, бо розробники зможуть виправляти помилки ще до того як відправити їх тестерам.

Тільки от біда, що є речі які автоматичними тестами не покриваються. Наприклад треба переконатись що текст не вилазить за межі кнопочки шаблон якої зверстали наші круті стиляги-верстальщики.

Рішення яке використовую я – під час розробки показати html що генерується у браузері. Як у webtest може об’єкт responce.

Перед тим як щось робити самому я звичайно погуглив, і знайшов спосіб, який щоправда трохи застарілий. Потрібно хоча б заголовок Content-Type передавати, тому що його не задають в мета-тегу, а в заголовках формату MIME.

Власне ось сам код – веб-сервер в одній функції що відповідає на один запит:

import webbrowser
from wsgiref.simple_server import make_server
def show_in_browser(html):
        html = html.encode('utf-8')
        def wsgiapp(environ, start_response):
        headers = [('Content-type', 'text/html; charset=utf-8'),
                   ('Content-Length', str(len(html)))]
        start_response('200 OK', headers)
        return [html]

    # нульовий порт означає "знайди вільний сам"
    server = make_server('127.0.0.1', 0, wsgiapp)
    webbrowser.open('http://127.0.0.1:%s' % server.server_port)
    server.handle_request() # один запит

Мене на рев’ю запитали чому ж я не запишу html в тимчасовий файл? Видно я вже занадто веб-девелопер, бо раніше не знав як таке зробити. Зараз знаю як створити тимчасовий файл, але щось локальні файли відкриваються неадекватно. В текстовому редакторі.


Filed under: Кодерство, Розмітка Tagged: HTML, розробка, Python