Пришло врем пересобирать Emacs,emacs сам себя не пересоберет.
В этой статье мы попытаемся собрать Emacs для работы c Python, попутно расскажу как работать с django и в конце попробуем настроить и развернуть openPLM(что собственно и являлось изначальной целью)
Table of Contents
Времена меняются и конфиг 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
Удобное дополнение при открытии файла или переключении буфера
В сборке 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 библиотеки установленные в контейнере.
- Статья о работе с virtualenv
- Документация на virtualenv
- Примеры возможностей и работы с вспомогательным virtualenvwrapper скриптом
Итак на основной машине нужно как минимум поставить
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 сервер он парсит вывод об ошибке, а заодно показывает файл с кодом где произошла ошибка.
Работаем с openPLM
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
Для того чтобы выпонлять в фоне тяжелые задачи не отвлекая пользователя, ну или просто организация многозадачности. Используют программы вроде 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
Ошибки
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
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
По мере сил появится. И да шаблон этого сайта надо перепиливать.