emacs_python_django_ide.png

Пришло врем пересобирать Emacs,emacs сам себя не пересоберет.

В этой статье мы попытаемся собрать Emacs для работы c Python, попутно расскажу как работать с django и в конце попробуем настроить и развернуть openPLM(что собственно и являлось изначальной целью)

Времена меняются и конфиг Emacs меняется вместе с ними, быть может при лучшем знании английского, навыка программирования я бы настроил emacs по лучше. Мой предыдущий конфиг был весьма прост, бралась сборка emacs-for-python особо не заглядывал под её капот а дальше выкачав с github все необходимое, я понял что этого мало и качал и качал разные расширения или ставил их через apt-get а потом оказывалось что в репозитории слишком старая версия и.т.д и.т.п.

Собираем Emacs 24.4

Почему 24, потому что пакетный менеджер, почему 24.4+, потому что всплывающая документация требует версий попозже. Для начала удалите все emacs пакеты из системы

Инструкция взята

sudo apt-get install build-essential
sudo apt-get build-dep emacs24
wget http://ftp.gnu.org/gnu/emacs/emacs-24.4.tar.gz
tar -xf emacs-24.4.tar.* && cd emacs-24.4
./configure
make
sudo make install

Получаем работающий ECB

Увы и ах ECB из пакетного менеджера а с ним и cedet не очень дружат с Emacs 24(или у меня кривые руки тогда поправте в чем не прав)

Решение:ECB от Alexott чтобы оно работало с Emacs24

cd ~/.emacs.d
git clone https://github.com/alexott/ecb

Правим .emacs конфиг

(add-to-list 'load-path "~/.emacs.d/ecb")

;; Хитрая конструкция внизу как я вспомнил
;; вызывает semantic mode если он не запустился
;; потому что почему то с python synaptic не хочет срабатывать
(semantic-mode -1) ;; Отключаем для проверки
(require 'ecb)
(add-hook 'ecb-activate-hook (lambda () (semantic-mode t)))

;; Отключение подсказок при включении ибо *@#$#!
(setq ecb-tip-of-the-day nil)

;; Передвижение границ окон и разделителей, работает только в
;; графическом режиме а не в терминале
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<up>") 'shrink-window)
(global-set-key (kbd "S-C-<down>") 'enlarge-window)

Комбинация Shift+Ctrl + стрелки передвегает рамки окон.

Для Emacs 25.0+ , ECB ставится из пакетного менеджера но дальше я не лез и снес 25+

Работаем с пакетным менеджером

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

Подключаем репозитории в .emacs конфиге

(when (>= emacs-major-version 24)
  (require 'package) ;; You might already have this line
  ;; For important compatibility libraries like cl-lib
  (add-to-list
   'package-archives 
   '("melpa" . "http://melpa.org/packages/") 
   t)
  (add-to-list
   'package-archives
   '("gnu" . "http://elpa.gnu.org/packages/")
   t)
  (package-initialize) ;; You might already have this line
  )

Теперь загрузившись в Emacs с этим конфигом открываем пакетный менеджер

M-x package-list-packages

Выбираем на нужные пакеты (поиск C-s) метим их установку i*(удалить метку *u) или удаление U пакетов, затем жмем исполнение x и наслаждаемся.

Устанавливаем пакеты

Пакеты необходмые для Python и django … в данном случае используем готовую сборку elpy котора поддерживает работу с синтаксическими анализаторами rope и jedi, использует автодополнение работающее через company

  • company
  • company-jedi
  • company-quickhelp
  • pony-mode
  • elpy
  • jedi-core
  • epc

Большинство пакетов вытянется как зависимости к elpy , а собственно из-за пакет company-quickhelp нам нужна была версия Emacs 24.4 и выше

  • idomenu — Удобное автодополнение при переключении буферов и открытии файлов ,может и больше
  • magit — Работа с git из Emacs
  • org — Описанный в ранней статье прекрасный org-mode ставится полная версия а не встроенная урезанная
    • babel
  • org-ac
    • auto-complete
    • auto-complete-pcmp
  • htmlize — Пакет необходим чтобы при экспорте кода в html подсветка сохранялась
  • org2blog — Экспорт в блоги поддреживающие xmlrpc
    • metaweblog
    • xml-rpc

Читаем документацию к Python

Раньше качал документацию по python и установли её как /usr/share/info/python*версия*.info Но можно поставить как пакет python-info

Можно смотреть документацию в pydoc и в браузере

Удобное дополнение при открытии файла или переключении буфера

В сборке Emacs-for-python входило удобное автодополнение при открытии файлов и переключении буферов. За это отвечает ido mode и судя по частоте упоминания на ЛОР-е он много всего умеет.

Настройки в конфиге .emacs

(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)

Настраиваем Elpy

Настройка в .emacs

(require 'elpy)
;;(prelude-require-packages '(elpy jedi))
(elpy-enable)
(elpy-use-ipython)
(setq elpy-rpc-backend "jedi")

(defun prelude-personal-python-mode-defaults ()
  "Personal defaults for Python programming."
  ;; Enable elpy mode
  (elpy-mode)
  ;; Jedi backend
  ;; (jedi:setup)
  ;; (setq jedi:complete-on-dot t) ;optional
  ;; (auto-complete-mode)
  ;; (jedi:ac-setup)
  ;; (setq elpy-rpc-python-command "python3")
  ;; (python-shell-interpreter "ipython3")
  (company-quickhelp-mode)
  )

(setq prelude-personal-python-mode-hook 'prelude-personal-python-mode-defaults)

(add-hook 'python-mode-hook (lambda ()
                              (run-hooks 'prelude-personal-python-mode-hook)))

Переключение между python и python3

Итак что нам необоходимо знать. Ну то что Python бывает разных версий, как минимум 2.7 и 3 и соответственно при каждом проекте нам желательно выбирать используемую версию языка.

Изначально я все это правил в конфиге,но потом я для себя открыл Virtualenv это такой контейнер работая в котором вы используете только python библиотеки установленные в контейнере.

Итак на основной машине нужно как минимум поставить

sudo  pip install virtualenv virtualenvwrapper
mkdir $HOME/.virtualenvs

Добавим в файл .bashrc информацию о расположении наших виртуальных сред.

tail -3 ~/.bashrc 
# For python venv simple work http://docs.python-guide.org/en/latest/dev/virtualenvs/
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Как создать виртуальную среду

$ mkvirtualenv -p python3 --no-site-packages box3
(box3)$ deactivate
$ workon box3
(box3)$ pip install ropemode_py3k jedi ipython flake8 importmagic
(box3)$ pip freeze
(box3)$ deactivate 
$ mkvirtualenv -p python2.7 --no-site-packages box2
(box2)$ pip install rope jedi ipython flake8 importmagic
(box2)$ deactivate

Собственно мы создали виртуальную среду box , указав какая версия python в ней будет использована, как видно в приглашении PS1 терминала появилось название текузего контейнера.

deactivate — это выход из виртуальной среды.

Затем активировали среду, командой workon предоставленной пакетом virtualenvwrapper

Потом установили пакет нужной версии внутрь виртуальной среды

А вот обратите внимание нахожусь внутри Virtualenv можно увидеть какие пути для всех необходимых Elpy библотек используются. Меню Elpy-Configure

Virtualenv........: box2 (/home/user/.virtualenvs/box2)
RPC Python........: 2.7.8 (/home/user/.virtualenvs/box2/bin/python)
Interactive Python: ipython (/home/user/.virtualenvs/box2/bin/ipython)
Emacs.............: 24.4.1
Elpy..............: 1.8.0
Jedi..............: 0.9.0
Rope..............: 0.10.2
Importmagic.......: 0.1.3
Syntax checker....: flake8 (/home/user/.virtualenvs/box2/bin/flake8)

Команда pip freeze показывает срез установленных в среде пакетов. Её вывод можно использовать для фиксации а также создания вертуальных сред с заданым набором софта.

(oldvenv)$ pip freeze > list.txt
(newvenv)$ pip install -r list.txt

Ведение проектов в elpy

M-x elpy-set-project-root задает корневую папку проекта:

  • C-c C-f Ищет файл среди файлов проекта и открывает его
  • C-c C-s Запускает Grep и показывает где упоминается данная переменная, Grep из Emacs интерактивный, можно переходить по ссылкам.

Проблемы

Выскакивали некие проблемы с фризом

C-g помогает выйти из фриза, загрузки.

После нужно ввести elpy-rpc-restart и повторно открыть буфер? в общем жесткач… хотя был ворнинг при установки elpy

для работы rope нужно указывать рутовую директорию проекта

Решил всё снес и с нуля ставить начал, cedet ему не мешает

Автодополнение с всплывающей(popup) документацией

Emacs-for-python использовал auto-complete — название пакета. А вот elpy использует company.

И судя по тому что company-jedi пакет требует emacs, а для автодополнение документации нужен company-quickhelp

Отсутствие анализа кода в окошке ECB

Решено выше ,повторным включением semantic-mode

Pony Mode

Пакет/модуль для emacs позволяющий

Работа с моделями

Запуск синхронизации с БД, миграции через South

Run server

C-p С-с r — Запускает встроенный django dev сервер

Если добавить в Installed APPS

'django_extensions',

Werkzeug — Можно использовать следующий dev сервер он парсит вывод об ошибке, а заодно показывает файл с кодом где произошла ошибка.

Fabric

Есть возможность запускать команды из fabric

Fabric библиотека на python для удаленного выполнения команд, аналог Re?x, необходима для автоматической настройки развертывания проектов.

Работаем с openPLM

emacs_elpy_proj.png

Figure 2: Запущен поиск переменной верхний правый буфер. Поиск по файлам проекта — низ. Запущенный dev сервер через pony в нижнем правом.

Создаем Virtualenv для openPLM

Смотрим на список зависимостей

Проблема pip то что он связан только с python поэтому библиотеки связки вроде psycopg, требуют установленного вначале PostgreSQL. Поэтому вначале apt-get.

apt-get install swig build-essential pkg-config gettext apache2 libapache2-mod-wsgi\
python-pip python-dev python-kjbuckets graphviz graphviz-dev rabbitmq-server postgresql\
 libpq-dev libgsf-bin imagemagick poppler-utils html2text odt2txt antiword catdoc

На данный момент пакеты в контейнере

pip freeze
amqp==1.4.6
anyjson==0.3.3
billiard==3.3.0.20
celery==3.1.0
Django==1.5.4
django-celery==3.1.16
django-extensions==1.5.5
django-haystack==1.2.7
docutils==0.12
flake8==2.4.1
html5lib==0.999999
importmagic==0.1.3
ipython==3.2.1
jedi==0.9.0
kombu==3.0.26
LEPL==5.1.3
librabbitmq==1.6.1
Markdown==2.6.2
mccabe==0.3.1
odfpy==1.3.1
pep8==1.5.7
PIL==1.1.7
Pillow==2.9.0
pisa==3.0.33
psycopg2==2.6.1
pyflakes==0.8.1
pygraphviz==1.2
pyPdf==1.13
python-dateutil==2.4.2
python-ptrace==0.8.1
pytz==2015.4
reportlab==2.7
rope==0.10.2
six==1.9.0
South==0.7.6
Werkzeug==0.10.4
wheel==0.24.0
xapian-haystack==1.1.5b0

также некоторых библиотек может не оказаться в pip и c помощью easy_install их тоже не поставить.

easy_install PIL

Пример: пакет kjbuckets это отдельный кусок большого пакета gadfly(ну если вы будуте тянуть код из svn разработчики там уже используется gadfly) и в pip его нет, пришлось ставить на хост машину и копировать в виртуальную среду.

cd .virtualenvs/openplm/lib/
mkdir pyshared
mkdir pyshared/python2.7
cp /usr/lib/pyshared/python2.7/kjbuckets.so pyshared/python2.7/
cd python2.7/site-packages/
cp -v /usr/lib/python2.7/dist-packages/kjbuckets* .
cd ~/.virtualenvs/openplm/share/doc/
cp -r /usr/share/doc/python-kjbuckets/ .
cd ~/.virtualenvs/openplm/share/
mkdir pyshared
cd pyshared/
cp /usr/share/pyshared/kjbuckets-2.2.egg-info .

cd ~/.virtualenvs/openplm/lib/python2.7/site-packages/
cp -r  /usr/lib/python2.7/dist-packages/xapian/ .

Теперь можете открыть файл settings проекта и выбрать в меню Virtual Envs -> workon -> openplm

ECB — включается ecb-activate , можете выбрать удобную Вам раскладку окон ecb-chnage-layout

Создаем ссылки и БД

Чтобы ничего особо не менять в коде openPLM нам необходимо создать следующие ссылки под рутом. Создать базу данных в PostgreSQL и пользователя для стека управления задачами — RabbitMQ

ln -s /home/source/somedir /var/openPLM
mkdir /var/django
ln -s /home/user/openPLM/openPLM/ /var/django/openPLM
su postgres
psql
postgres=#create database openplm;
postgres=#create role django with password 'MyPassword' login;
exit;

service rabbitmq-server start
rabbitmqctl add_user openplm 'secret' (change this password, use single quotes to put special characters or spaces)
rabbitmqctl add_vhost openplm
rabbitmqctl set_permissions -p openplm openplm ".*" ".*" ".*"

Прописываем католог где будут хранится поисковые индексы xapian

sudo ln -s /home/user/somedir /var/openPLM

Под обычным пользователем синхронизируемся с БД

workon openplm
(openplm)$ cd /var/django/openPLM/
(openplm)$ python bin/change_secret_key.py
(openplm)$ python manage.py syncdb --all
(openplm)$ python manage.py migrate --all --fake
(openplm)$ python manage.py loaddata extra_lifecycles
(openplm)$ python manage.py collectstatic
(openplm)$ python manage.py rebuild_index
(openplm)$ deactivate

Сelery и RabbitMQ

rabbitmq_console.png

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

Некий процесс порождает сообщение и отправлет его в местную почтовую службу(RabbitMQ), проходя сортировочные пункты (Exchanges) сообщение попадает в очередь(Queue) откуда его может забрать Celery, собственно с помощью библиотеки Celery реализуются обработчики этих сообщений. Ведь ресурсы и количество единовременно работающих процессов Celery ограничено поэтому обработчике ещё и связваются между собой.

Уроки для понимания работы AMPQ и конкретно RabbitMQ

Статья источник — отладка Celery

Для отслеживания сообщений поступающий в RabbitMQ, можно вопользоваться веб интерфейсом, для начало надо активировать панель управления.

Ну-ка от рута

sudo rabbitmq-plugins enable rabbitmq_management
sudo service rebbitmq-server restart

Дальше веб интефейс ждет нас по адресу http://localhost:15672/ c логином и паролем guest по умолчанию

На скриншоте чуть выше показан список очередей(помечены как D)

Перед работой на dev машине нужно запустить celery

python manage.py celery worker -l debug -Q index,mails,index.mails,celery,step

Что такое Celery зачем нужно и как с ним работают

Ошибки

KeyError openPLM.apps.rss.urls

в sys.modules видим следующую тафтологическую фигню

'openPLM.openPLM.apps.rss.urls'

'openPLM.plmapp.views'
'openPLM.openPLM.plmapp.views'

Оказалось по идиотски в папке forge/pmg/django/openPLM/openPLM/ была ссылка openPLM на эту же папку.

IpmortError: No module named reportlab.lib.units

Поставил

pip install reportlab
Downloading reportlab-3.2.0.tar.gz (1.9MB)

Оказалось что openPLM нужно что то в диапазоне от 2.1 до 3.0. Потом ещё pip не вытянул html5lib по зависимостям.

pip install 'reportlab<3'                                                                                                                                                                               
Downloading reportlab-2.7.tar.gz (2.0MB)
pip install html5lib

django.contrib.sites.models.DoesNotExist

http://stackoverflow.com/questions/11476210/getting-site-matching-query-does-not-exist-error-after-creating-django-admin

Open the Django shell for your site (python manage.py shell).

from django.contrib.sites.models import Site
Site.objects.create(name='example.com', domain='example.com')

Тут ещё писать и писать, но мне уже надоело, оно одно за другим тянется и в процессе я это допишу ,но то чего здесь написано, спрошено уже вполне хватает чтобы запустить. Да без PythonOCC(который надо тыкать палкой), да пока не разобрался с RabbitMQ и его отладкой(у него есть веб интерфейс щупал год назад), а также запуском Celery

По мере сил появится. И да шаблон этого сайта надо перепиливать.