В сети часто возникают разговоры на тему «Python best IDE — does it really exist?». Для примера — недавний Q&A в группе Python community на LinkedIn (к сожалению, просмотр возможен только для пользователей группы). Если вкратце, то мир вертится вокруг:

  • Eclipse + PyDev — похоже, что самое популярное из свободных решений.
  • Komodo IDE — по отзывам отличное средство, но не free.
  • WingIDE — лучший autocompletion для Python, но опять-таки non-free.
  • Eric — IDE на Qt и QScintilla, пробовал только на Windows, видно недопробовал — показалась неудобной. Если у кого есть полезная информация и ссылки — поделитесь, пожалуйста, в комментариях.
  • NetBeans 6.5 — готовится к выходу встроенная поддержка Python в этой IDE версии 6.5, ждем с нетерпением!
  • Vim — для фанатов Vim ничего лучше быть, понятно, не может — после обработки напильником, правда.
  • Emacs — аналогично Vim — для пользователей, которые много времени проводят в Emacs, он дает лучший user-experience при разработке на любом языке.


Если первые четыре решения предоставляют IDE для Python прямо из коробки, то последние два требуют опред��ленных настроек. Для Vim не знаю, но для Emacs надо потратить не меньше 6 часов поисков по интернету и экспериментов перед тем как будет получена удобная и (очень) функциональная среда для Python.

Что до меня, то весьма долгое время я работал с Eclipse + PyDev — вполне работоспособное решение. Но после окончательного переезда с Windows в Ubuntu (всем ставить шрифты Liberation в Убунте!), я решил таки завершить начатое уже давно — начать использовать Emacs не только как GTD-органайзер, IRC-клиент и редактор «когда не хочется запускать Eclipse».

История данных шести часов под хабракатом (история предполагает, что читающие хоть немного знакомы с Emacs и Python, а также носит Ubuntu(Debian)-specific оттенок, когда дело касается установки пакетов).



Emacs Python-Mode


Emacs версий 21 и старше имеют встроенный режим программирования на Python, называемый по имени файла модуля python.el. Существует и независимый проект, который дает примерно ту же функциональность. Сравним оба решения.

Встроенный python.el


Хорошая новость для тех, кому просто нужен удобный и функциональный текстовый редактор для python-скриптов – можно ничего, что описано ниже не делать, python.el обеспечивает хороший комплект возможностей прямо из коробки:

  1. Синтаксическая подсветка кода.
  2. Автоматическое расставление отступов.
  3. Возможность запуска внутреннего (в Emacs) интерпретатора.
  4. Запуск редактируемого кода во внутреннем интерпретаторе (как всего буфера, так и выделенной его части).
  5. Какой-никакой completion.
  6. Удобные функции комментирования/раскомментирования кода.
  7. Взаимодействие со справочной системой Python.


Независимый python-mode.el


Походив некоторое время по просторам интернета на тему «python-mode.el vs. python.el», я пришел к выводу, что большая часть сообщества пользуется модулем python-mode.el. Основные причины этого вполне себе изложены в этой ветке на форуме velocityreviews. Из основных можно выделить:

  1. Плохая «встроенность» внутреннего интерпретора у python.el.
  2. Отсутствие обозревателя классов у python.el.
  3. «Совсем не тот look&feel как у старого доброго python-mode.el» — сообщество придирчиво :)


Собственно различий не так уж и много и сразу они не будут заметны — нужно какое-то время поработать там и там, чтобы их обнаружить. Но я все-таки поставил python-mode.el: sudo aptitude install python-mode и делов — даже .emacs править не надо.

Итак, считаем, что режим выбрали, переходим дальше после пары скриншотов Emacs в Python-Mode:





Наблюдательные, наверное, заметили, что у меня в Emacs ttf-шрифты? Об этом будет небольшой следующий пост. Также можно заметить, что ошибки подсвечиваются на лету.

Подсветка ошибок на лету — pylint


У Emacs есть отличный режим flymake-mode, который позволяет подсвечивать на лету все ошибки компиляции (а также предупреждения и сообщения о плохом стиле программирования). Беда в том, что по умолчанию Python не поддерживается. Исправляем это упущение:

В консоли:
sudo aptitude install pylint pymacs

Эти пакеты требуются для flymake в python-mode. pylint — для проверки кода на ошибки, pymacs обеспечивает двусторонее взаимодействие между Python и EmacsLISP'ом.

Создайте следующий скрипт в вашем PATH (я создал в ~/bin), назовите его epylint:

#!/usr/bin/env python

import re
import sys

from subprocess import *

p = Popen("pylint -f parseable -r n --disable-msg-cat=C,R %s" %
          sys.argv[1], shell = True, stdout = PIPE).stdout

for line in p.readlines():
    match = re.search("\\[([WE])(, (.+?))?\\]", line)
    if match:
        kind = match.group(1)
        func = match.group(3)

        if kind == "W":
            msg = "Warning"
        else:
            msg = "Error"

        if func:
            line = re.sub("\\[([WE])(, (.+?))?\\]",
                          "%s (%s):" % (msg, func), line)
        else:
            line = re.sub("\\[([WE])?\\]", "%s:" % msg, line)

        print line,

    p.close()


Данный скрипт будет проверять наши исходники на ошибки вызовом pylint'а.

Далее, в вашем .emacs (обычно ~/.emacs, но у упорядоченных людей имеется небольшая иерархия файлов, вроде programming.el, python.el, common.el, которые подгружаются в .emacs c помощью load-file) добавляем строки:

(when (load "flymake" t)
  (defun flymake-pylint-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "epylint" (list local-file))))

  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pylint-init)))

(add-hook 'python-mode-hook 'flymake-mode)


Последняя ��трочка необязательна — она включает режим flymake по умолчанию для всех новых буферов, использующих python-mode. Если ее не написать, для включения flymake нужно будет выполнять M-x flymake-mode в нужном буфере.

Все, подсветка ошибок должна заработать.

Рефакторинг и completion Python-кода


Идем на SourceForge-хостинг проектов Rope и Ropemacs, качаем rope и ropemacs, устанавливаем — sudo python setup.py install — оба пакета.

После этого нужно добавить в .emacs-файл строки:

(require 'pymacs)
(pymacs-load "ropemacs" "rope-")


Возможно, что вы заметили в процессе, что оба пакета rope и ropemacs — обычные python-модули. А расширение функционала Emacs с помощью ropemacs происходит через pymacs — который связывает EmacsLISP и Python.

Смотрим результат (обратите внимание на меню — там появился пункт «Rope», через который доступны большинство функций ropemacs):

Completion (срабатывает по нажатию M-/):


Рефакторинг (на примере Rename):


На самом деле это не лучший completion, который можно получить в Emacs для Python, но давайте в следующий раз :) Обещаю рассказать про свои дальнейшие изыскания.

Для новичков в Emacs


Я привык к Emacs'у, его сочетаниям клавиш и общей парадигме — поэтому со всем тем, что у получилось в итоге, мне работать в удовольствие — пальцы летают по клавиатуре, о мыши совсем забыл, минибуфер рулит… Однако у меня есть серьезные опасения, что у тех, кто Emacs'ом пока не пользовался, но хотел бы, возникнут серьезные проблемы — это как после Windows пересесть на Linux, очень похожие ощущения. Кнопки странные, курсор двигать слишком мудрено, какие-то буферы, окна… Именно для таких читателей пишу — если правда хочется попробовать Emacs (не зря же о нем столько разговоров) — пройдите сначала Emacs tutorial, потом поиграйте с ним с недельку по вечерам и уже потом запускайте его в свой рабочий процесс — отвыкнуть будет сложно. Я сам скептически относился к этому «редактору» полгода назад — а сейчас он у меня работает от включения до выключения компьютера, заменяя с десяток программ (органайзер, дневник, IDE для разных языков, просто редактор, jabber и IRC-клиент, средства для написания и публикования документации в html и не только, файловый менеджер) — причем он не навязывается, он просто удобней их.

Всем спасибо за внимание, надеюсь, информация будет полезной для вас. И да — это моя первая публикация на хабре, если есть оплошности — пишите в комментариях, учту на будущее.

Источники и полезные ссылки (многие из EmacsWiki по Python-Mode)


EmacsWiki по Python-Mode
Выбор между python.el и python-mode.el
Bazaar-репозитарий проекта python-mode.el
Включение completion в python-mode
Использование C-c! для запуска ipython вместо python
Нажимаем F1 для проверки кода pylint'ом
Отличный code completion и рефакторинг python-кода
Отладка python-кода в Emacs: PdbNotes
Python completion с pycomplete
И еще про completion