Как стать автором
Поиск
Написать публикацию
Обновить
397.92

Python *

Высокоуровневый язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

PyGTK: потоки и магия обёрток

Время на прочтение9 мин
Количество просмотров5.6K
Всем хорош GTK+, но наблюдается большая проблема при работе с ним в многопоточных приложениях. Сам по себе GTK является thread-safe, но требуя принудительной блокировки со стороны пользователя. Вторая проблема заключается в том, что блокировка реализована через мутексы, и вы должны вызывать блокировку строго один раз, иначе ваш код «зависнет» на linux, прекрасно при этом работая на windows.
Как бороться?

Наивный Байесовский классификатор в 25 строк кода

Время на прочтение3 мин
Количество просмотров90K
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.

И так, для примера возьму задачу определения пола по имени. Конечно, чтобы определить пол можно создать большой список имен с метками пола. Но этот список в любом случае будет неполон. Для того чтобы решить эту проблему, можно «натренировать» модель по маркированным именам.
Если интересует, прошу
под кат

Класс-клиент goo.gl и настройка API

Время на прочтение4 мин
Количество просмотров36K
UPD: репозиторий теперь на Гитхабе.

Здравствуйте, коллеги!

Помню, в свое время меня очень обрадовала новость, что у гугловской сокращалки урлов появились официальные API. В то время я как раз разрабатывал приложение, которому часто требовалось сокращать ссылки новостных лент. Я как раз прикручивал bit.ly, но испытал соблазн попробовать новый сервис от Гугла. Воспользовавшись документацией, я за несколько часов набросал базовый функционал и встроил скрипт в проект.

С течением времени в скрипт вносились изменения, и, наконец, я решил дополнить код комментариями, написать простую документацию и выложить всё на гуглокод.

Основные возможности и особенности класса от конкурентов:
Читать дальше →

ConfigParser и Unicode

Время на прочтение3 мин
Количество просмотров17K
В Python есть очень удобный модуль для сохранения и чтения ini-подобных конфигурационных файлов, который называется ConfigParser.

У меня при его использовании возникла проблема, связанная с сохранением в файл Unicode-строк. В некоторых трудноуловимых случаях (например, у меня это проявилось при работе приложения под Windows XP) при чтении или записи таких параметров выскакивает ошибка конвертации строк.

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

Хочу предложить свое решение для тех, кто использует Python 2.X — оно довольно простое и помогает решить эту проблему.

Читать дальше →

Потоки в wxPython

Время на прочтение14 мин
Количество просмотров6K
При написании программ на Python, используя при этом графический интерфейс иногда приходится запускать различные долгие обработки каких либо данных, при этом в большинстве случаев будет блокироваться интерфейс и пользователь увидит программу замороженной. Чтобы этого избежать необходимо нашу задачу запустить в параллельном потоке или процессе. В данной статье мы рассмотрим, как это сделать в wxPython с помощью модуля Threading.

Потокобезопасные методы wxPython


В wxPython существуют три метода для работы с потоками. Если ими не пользоваться, то при обновлении интерфейса программы Python могут подвиснуть. Чтобы этого избежать, необходимо использовать потокобезопасные методы: wx.PostEvent, wx.CallAfter и wx.CallLater. По словам Robin Dunn (создатель wxPython) wx.CallAfter использует wx.PostEvent для отправки события на объект приложения. Приложение будет иметь обработчик этого события и будет реагировать на него соответственно заложенному алгоритму. На сколько я понимаю wx.CallLater вызывает wx.CallAfter с заданным параметром времени, чтобы он знал сколько ему ждать перед отправкой события.

Robin Dunn также отметил, что Global Interpreter Lock (GIL) не допустит одновременного выполнения более одного потока, что может ограничить количество используемых ядер процессора. С другой стороны, он также сказал, что wxPython освобождается от GIL вызывая API функции библиотеки wx, поэтому другие потоки могут работать одновременно. Другими словами быстродействие может изменяться при использовании потоков на многоядерных машинах. Обсуждение этого вопроса может быть интересным и не понятным…
Прим. перев. — для более полного знакомства с GIL прошу сюда.

Наши три метода можно разделить на уровни абстракции, wx.CallLater находится на самом верху, далее идет wx.CallAfter, а wx.PostEvent находится на самом низком уровне. В следующих примерах вы увидите, как использовать wx.CallAfter и wx.PostEvent в программах WxPython.
Читать дальше →

Как поднять сервер для python скриптов за 1 минуту

Время на прочтение1 мин
Количество просмотров71K
Ола, амигос!
Недавно в топике Мешок банальных советов комментатор alexanderyastrebov предложил простой способ запустить простой http-сервер с помощью 1й строчки в консоли.
Я решил попробовать найти, можно ли на нем запускать еще и питоновские скрипты, и вы, читая этот топик, наверное, уже догадались, что можно.
Сам сервер запускается одной коммандой:
python -m CGIHTTPServer
Как вы можете видеть, по умолчанию он использует 8000й порт и предоставляет доступ к текущей директории терминала. Но скрипты должны запускаться из папки «cgi-bin» текущей директории. Например так:
localhost:8000/cgi-bin/helloworld.py
Спасибо за внимание!
UPD все же напишу, как мне казалось, очевидную вещь: для веб разработки конечно нужен серьезный веб-сервер.

Асинхронный удар

Время на прочтение5 мин
Количество просмотров16K
imageКак уже наверное кто-то догадался, в этой статье речь пойдет о сокетах, и фреймфорках облегчающих работу с ними. Недавно я начал работу надо новым проектом, онлайн игрой. Для таких проектов довольно критично время ответа от сервера, если это конечно не пошаговая стратегия, хотя и в этом случае пожалуй тоже. Так как же этого добиться при суровой ограниченности ресурсов?
  • Облегчить сервер от ненужной работы, например отрисовки самой странички, используя вместо этого javascript шаблонизатор.
  • Использовать хороший front-end, например nginx, учитывая пункт первый, динамики у нас нет, и это нам вполне подходит.
  • Распределяя нагрузку на frontend, например используя Tornado.

Остался самый главный вопрос, что будет происходить когда пользователь совершает какое-либо действие? Обычные ajax запросы не подойдут, вполне понятно почему. Поэтому нам на помощь приходят сокеты.
Читать дальше →

Создание py2exe сборок с модулями Python, содержащими сторонние файлы

Время на прочтение6 мин
Количество просмотров11K
Для краткости, введем обозначение «нестандартные» — под этим термином будем далее подразумевать такие модули, которые содержат в себе файлы, отличные от *.py. К примеру это могут быть библиотеки (*.pyd), картинки, иконки, и т.д.

Первая проблема состоит в том, что практически все сборщики бинарных «дистрибутивов» python-приложений, такие как py2exe, bbfreeze, cx_Freeze, и другие, забирают из таких модулей только *.py файлы. Вторая проблема возникает со сложными namespace-модулями, такими как ETS — часто сборщик не может правильно разобрать все их внутренние зависимости.

Конкретно в моем случае камнями преткновения оказались все модули ETS (mayavi, chaco, и т.д.), m2crypto, vtk, h5py, matplotlib и несколько других (вообще, как выяснилось, таких модулей очень много).

Я попробовал протестировать разные сборщики и поначалу остановился на cx_Freeze, т.к. он единственный умеет более-менее правильно импортировать ETS «из коробки». Однако, его оказалось недостаточно: он не смог справиться с другими нестандартными модулями, а также по ряду других причин (к примеру, мне так и не удалось скрыть окно консоли, поставить кастомную иконку, и пр.). Конечно, там есть механизм «рецептов» (совсем не документированный), который даже работает, к примеру, для matplotlib, но хотелось более универсального и простого решения, чем писать подобный рецепт под каждый модуль.

В итоге я остановился на py2exe, т.к. с ним удалось решить все вышеназванные проблемы. Поскольку на это ушло довольно-таки значительное время, то хочу с вами поделиться — может кому тоже понадобится.
Читать дальше →

Пайпы, the pythonic way

Время на прочтение3 мин
Количество просмотров19K
Одни питонисты любят код читаемый, другие предпочитают лаконичный. К сожалению, баланс между первым и вторым — решения по-настоящему изящные — редко случается встретить на практике. Чаще стречаются строки вроде
my_function(sum(filter(lambda x: x % 3 == 1, [x for x in range(100)])))
Или четверостишья а ля
xs = [x for x in range(100)]
xs_filtered = filter(lambda x: x % 3 == 1, xs)
xs_sum = sum(xs_filtered)
result = my_function(xs_sum)
Идеалистам же хотелось бы писать как-то так
result = [x for x in range(100)] \
    | where(lambda x: x % 3 == 1)) \
    | sum \
    | my_function

Не в Питоне?
Зря так думаете...

IPython advanced usage

Время на прочтение4 мин
Количество просмотров14K
Данный инструмент знаком большинству разработчиков на Python.
В тоже время, не так много людей подозревают о раширенных возможностях предоставляемых данной интерактивной оболочкой, пользуясь в основном автодополнением.

Terminal 2014 python 2014 125ճ0image

Статья построенна на выдержках из обширной, понятной и красивой документации ipython.github.com/ipython-doc/dev/interactive/index.html
Пропустим такие явные вещи, как автодополнение и история команд, сохраняемая мыжду вызовами.
Читать дальше →

PDF-принтер Хабра с подсветкой кода на Python

Время на прочтение6 мин
Количество просмотров1.9K
На написание данной программы (а в последствии и статьи) меня сподвиг вот этот пост. Так уж вышло, что я имею привычку по-возможности сохранять прочитанные статьи, поскольку все помнить невозможно, и неизвестно когда что может пригодиться. Так что, прочитав вышеупомянутый пост и вспомнив про столь дорогую мне возможность печатать в PDF страницы из Википедии, закономерно появилась мыслишка сделать такой же «принтер» для Хабра, чтоб иметь возможность заполучить в личный архив вызвавшие у меня интерес статьи.

Первой попыткой было использование столь любезно предоставленной автором поста-вдохновителя программы. И практически сразу нашлись грабли, которые игнорировать было выше моих сил. Грабли эти — подсветка кода.

Сразу оговорюсь, на Хабре я новичок и как что работает имею очень смутное понятие. Однако взглянув на исходник страницы со статьей, в которой представлен фрагмент кода, стал понятен источник проблемы. И он *барабанная дробь* в том, что раскраской кода занимается JavaScript. Нет, для чтения через браузер это конечно хорошо и круто, но питоновская pisa, которая и занимается отрисовкой страницы в PDF, код раскраски выполнить не может в принципе.

Возникла идея — надо что-то придумать.
Читать дальше →

CityHash для Python

Время на прочтение1 мин
Количество просмотров2.8K
Буквально вчера компанией Google была выложена библиотека CityHash с набором хеш-функций для строк.
Мне захотелось попробовать поиспользовать CityHash в своих проектах на Python, а так как сейчас начал заниматься Cython'ом, решил быстренько сделать обертку для CityHash на Cython.
Читать дальше →

Как я боролся с кодировками в консоли

Время на прочтение6 мин
Количество просмотров173K
В очередной раз запустив в Windows свой скрипт-информер для СамИздат-а и увидев в консоли «загадочные символы» я сказал себе: «Да уже сделай, наконец, себе нормальный кросс-платформенный логгинг!»

Об этом, и о том, как раскрасить вывод лога наподобие Django-вского в Win32 я попробую рассказать под хабра-катом (Всё ниженаписанное применимо к Python 2.x ветке)
Читать дальше →

Ближайшие события

Генератор звуковых ландшафтов Boodler

Время на прочтение1 мин
Количество просмотров3.3K
На Хабре уже обсуждался Nature Sounds — флэш-микшер, на котором можно сгенерировать для себя оптимальное сочетание звуков природы. Выбираете от одного до четырёх звуковых потока, для каждого указываете громкость и распределение по каналам, а также паттерн проявления.

Если вы подобрали на редкость удачное сочетание, можно его сохранить в виде уникального URL или в WAV-файл. Но у этого сервиса есть один крупный недостаток — он требует Flash.
Читать дальше →

Использование XmlRPC через прокси-сервер для хоста с авторизацией

Время на прочтение7 мин
Количество просмотров2.7K
Сразу оговоримся, что речь идет о Python 2.X.

Задача: заставить xmlrpclib в Python работать через прокси-сервер с авторизацией Basic и NTLM, а также с хостом, требующим авторизацию и Cookies.

Мне это было нужно для системы багрепортов в нашем приложении, где при отправки сообщения об ошибке в TRAC должен создаваться тикет с описанием, логами, и прочим. Общение с TRAC'ом идет как раз через xmlRPC (используя XmlRpcPlugin). Пользователи приложения в основном работают за прокси-сервером внутри корпоративной сети.

Реализуется это через создание транспорта на основе urllib, который перенаправляет XML-запросы через прокси-сервер.

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

Данный вариант транспорта поддерживает также работу без прокси-сервера (если прямое соединение доступно, а указанный прокси-сервер — нет, то соединение произойдет напрямую — это особенность urllib2).

Для поддержки NTLM-авторизации используется python-ntlm.

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

Пример использования:

Copy Source | Copy HTML
  1. serverURL = "http://some.server.com/xmlrpc"
  2.  
  3. xmlTransport= UrllibTransport()
  4. server = xmlrpclib.ServerProxy(serverURL, transport = xmlTransport)


Читать дальше →

PyUNO — быстрое незначительное редактирование xls-отчета из Python

Время на прочтение3 мин
Количество просмотров14K

Просто и быстро


Не так давно я столкнулся с необходимостью запротоколировать список изменений в нашем ПО. Заказчик прислал мне формуляр, который я должен был заполнить в соответствии с их внутренними требованиями к документации. Я открыл прилагавшийся к письму файл «Изменения 1.xls» и немного приуныл. Точнее, мне в голову последовательно пришли мысли об увольнении, а затем — о самоубийстве. Формуляр состоял из 14 колонок. Быстро перемножив в уме количество колонок с числом внесенных нами атомарных изменений (около пятисот), я пошел курить.
Сделать такую работу руками мне не под силу. Большинство данных (номера новых версий, описания изменений и т. п.) у меня, конечно, имелись в наличии, но в разных местах и самых причудливых форматах. Но семьсот копипастов — увольте. Поэтому мне пришлось немного освоить PyUNO. На всякий случай — опишу вкратце процесс управления документом OOo из питоновского биндинга, вдруг кому пригодится.
Поехали!

Unladen Swallow — всё…

Время на прочтение5 мин
Количество просмотров3.9K
От переводчика: пару часов назад Гвидо в своём твиттере упомянул блог-пост своего коллеги, одного из (бывших) разработчиков Unladen Swallow, в котором тот рассказывает грустную историю яркой, но короткой жизни Unladen Swallow в Google.

Оригинал: Reid Kleckner — Unladen Swallow Retrospective


Читать дальше →

Распознавание некоторых современных CAPTCHA

Время на прочтение15 мин
Количество просмотров79K
Именно так называлась работа, представленная мной на Балтийском научно-инженерном конкурсе, и принёсшая мне очаровательную бумажку с римской единичкой, а также новенький ноутбук.

Работа заключалась в распознавании CAPTCHA, используемых крупными операторами сотовой связи в формах отправки SMS, и демонстрации недостаточной эффективности применяемого ими подхода. Чтобы не задевать ничью гордость, будем называть этих операторов иносказательно: красный, жёлтый, зелёный и синий.

Читать дальше →

Как работает glow.mozilla.org

Время на прочтение1 мин
Количество просмотров633


В блоге Mozilla объясняется, как SQLStream обрабатывает статистику загрузок Firefox 4.0 с каждого сервера и выдаёт почти в реальном времени карту скачиваний на сайте glow.mozilla.org. Там же выложены исходники бэкенда на Python.
Читать дальше →

Вклад авторов