4 мая 2012 г.

PyQt4 на сервере без иксов (centos)

Понадобилось мне запустить бота, написанного на PyQt4 на сервере без иксов (обычная vds centos под Xen-ом). Что из этого вышло смотрите далее.

При запуске приложения, PyQt4 сказала cannot connect to X server, из чего можно сделать вывод, что даже без использования UI классов, Qt таки хочет видеть рядом поднятый xorg.

Вариантов решения данной проблемы достаточно много (начну с самых суровых)

Вариант 1 - Десктопный дистрибутив
Самый надёжный, но и прожорливый вариант решения данной проблемы - поставить на vps десктопный дистрибутив вашей системы. Этот вариант, конечно, рабочий, однако уж очень плодовит на разношёрстные проблемы при повседневном использовании.
Тут вроде всё понятно и рассказывать нечего.

Вариант 2 - Установка иксов на серверный дистрибутив
Вариант, в принципе, вполне рабочий.
У меня, правда, вообще не вышло поднять на сервере иксы, всё время валилась ошибка
(EE) FBDEV(0): FBIOBLANK: Invalid argument 
но это можно списать на кривизну рук (хотя казалось бы 2 команды ровно). Если кому интересно - в инете полно руководств.

Вариант 3 - xvfb-run
Устанавливаем
yum install xorg-x11-server-Xvfb

Запускаем приложение так
xvfb-run python test.py

Всё работает и не жужжит. Однако, поскольку xvfb-run по дефолту создаёт дисплей :99, одновременная работа двух таких команд может привести к неопределённым глюкам. Можно конечно написать отдельный менеджер дисплеев, который будет проверять, сколько в данный момент запущено xvfb, и стартовать новый с другим номером дисплея, но есть решение проще.

Вариант 4 -  единый инстанс Xvfb
Решением проблемы одновременного запуска двух дисплеев с одним номером может стать запуск одного инстанса xvfb и коннекта к нему всех приложений. Кроме решения данной проблемы, этот вариант так же ведёт к сокращению накладных расходов на запуск дисплеев.

Запускаем экран (там много опций, не ленитесь)
Xvfb :66 -screen 0 1024x768x32 > /dev/null &

Запускаем приложение
DISPLAY=:66 python test.py
или внутри скрипта
os.environ['DISPLAY'] = ':66'

Всё, опять же, работает и не жужжит и теперь даже одновременный запуск нескольких приложений работает с одним дисплеем.

Вариант 5 - xpra
Надстройка над предыдущим вариантом, сделанная для удобства работы с правами доступа и внешними подключениями к дисплею.

Ставим зависимости
yum install gcc Pyrex xorg-x11-server-Xvfb Cython libX11-devel libXtst-devel  libXcomposite-devel libXdamage-devel pygobject2-devel pygtk2-devel gtk2-devel

Качаем и ставим сам xpra
./do-build
export PYTHONPATH=$PWD/install/lib/python:$PYTHONPATH

Стартуем дисплей 66
install/bin/xpra start :66

Запускаем приложение так
DISPLAY=:66 python test.py


Полезные ссылки
http://forum.ru-board.com/topic.cgi?forum=65&topic=3933
http://habrahabr.ru/post/128078/
http://habrahabr.ru/post/113928/


ПС: да, да, мисье знает толк =))

Комментариев нет: