Pyqt4: Проблемы Со Сборкой Qthelp

Все началось с того, что я захотел установить Python3 и Эрик5 на мой Кубунту 12.04. Поскольку в репозиториях Pangolin присутствует только Eric4, было решено устанавливать всё вручную из исходного кода.

На самом деле ничего сложного в такой установке нет: устанавливаю Python3, затем ГЛОТОК , Дальше PyQt4 , Затем QScintilla2 .

На первый взгляд все прошло гладко.

Спешно захожу в директорию с дистрибутивом (не побоюсь этого слова) Эрик5 и набираю заветное

  
  
   

sudo python3 install.py

Каково же было мое удивление, когда скрипт отобразился в консоли.



Found PyQt4 Sorry, please install QtHelp. Error: No module named QtHelp

Забавно, я думаю может установщик глючит? Запускаю в этой же консоли интерпретатор третьего Питона, ввожу

>>> import PyQt4.QtHelp Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named QtHelp

Оказывается, QtHelp действительно не установился.

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

Пожарил, съел, покурил, вернулся к ноуту, проверил - то же самое, проблема осталась.

Я решил обратиться к всезнающему Гуглу.

Всезнающий определил проблему, но не дал решения.

Некоторые люди никогда не решали ее, у других ее просто нет. Хотя Прямо здесь Пишет, что ошибка исправлена.

Да, это исправлено, да.

Ничего не остается, как взять в руки скальпель и начать глубокое расследование.

В первую очередь меня интересовал консольный вывод скрипта configure.py, поскольку он отвечает за генерацию исходников C++, из которых make затем будет собирать файлы двоичной библиотеки.

Этот скрипт выводит довольно много текста, но мне были важны только те части, которые касались проблемного QtHelp:

Checking to see if the QtGui module should be built. Checking to see if the QtHelp module should be built. Checking to see if the QtMultimedia module should be built. .

These PyQt modules will be built: QtCore, QtGui, QtNetwork, QtDBus, QtDeclarative, QtOpenGL, QtScript, QtScriptTools, QtSql, QtSvg, QtTest, QtWebKit, QtXml, QtXmlPatterns, QtDesigner.

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

И действительно, посмотрев каталог, из которого установлен PyQt4, вы заметите, что скрипт configure.py создал одноименные подкаталоги для всех модулей Qt (QtCore, QtQui, QtNetwork и т. д.), содержащие код C++.

Для всех, кроме QtHelp. Здесь вам нужно заглянуть внутрь скрипта и увидеть две вещи.

Во-первых, что такое список «модули будут построены»? Во-вторых, как туда попадают данные.

Открываю в Кейт configure.py, ищу заветный текст и вижу вот такой кусок кода:

sipconfig.inform("The Qt mkspecs directory is in %s." % qt_datadir) sipconfig.inform("These PyQt modules will be built: %s." % ", ".

join(pyqt_modules)) sipconfig.inform("The PyQt Python package will be installed in %s." % opts.pyqtmoddir)

Да, данные хранятся в списке pyqt_modules. Как они туда попадают? Наверняка, при проверке следующего модуля.

Теперь стоит поискать в скрипте текст «Проверка наличия модуль должен быть построен.

»:

def check_module(mname, incfile, test, extra_include_dirs=None, extra_lib_dirs=None, extra_libs=None): """See if a module can be built and, if so, add it to the global list of modules. mname is the name of the module. incfile is the name of the include file needed for the test. test is a C++ statement being used for the test. extra_include_dirs is an optional list of extra include directories. extra_lib_dirs is an optional list of extra library directories. extra_libs is an optional list of extra libraries. """ # Check that the module is enabled if we are not automatically enabling all # modules. if len(opts.enabled) > 0 and mname not in opts.enabled: return # Check the module's main .

sip file exists. if os.access(os.path.join(src_dir, "sip", mname, mname + "mod.sip"), os.F_OK): sipconfig.inform("Checking to see if the %s module should be built." % mname) if check_api(incfile, test, mname, extra_include_dirs=extra_include_dirs, extra_lib_dirs=extra_lib_dirs, extra_libs=extra_libs): pyqt_modules.append(mname)

Бинго! Это именно то, что вам нужно! Здесь вы можете видеть, что в случае успешного вызова check_api() список pyqt_modules пополнится еще одним значением — именем проверяемого модуля.

Изначально я хотел покопаться в вызове check_api(), и элементарная логика подсказывала, что это правильный путь.

Однако не знаю, что меня побудило, но я решил посмотреть на код, вызывающий процедуру проверки check_module():

def check_modules(self): .

# Note that the order in which we check is important for the # consolidated module - a module's dependencies must be checked first. pyqt_modules.append("QtCore") check_module("QtGui", "qwidget.h", "new QWidget()") check_module("QtHelp", "qhelpengine.h", "new QHelpEngine(\"foo\")") check_module("QtMultimedia", "QAudioDeviceInfo", "new QAudioDeviceInfo()")

И тут я заметил, что QtCore добавляется в pyqt_modules без каких-либо проверок.

Жажда экспериментов взяла свое: почему бы просто так не добавить QtHelp? Ведь в случае неудачи я ничего не потеряю и продолжу «возиться» дальше, а в случае успеха быстро начну работать с любимой IDE. Сказано - сделано.

Я закомментирую вызов check_module("QtHelp") и вставляю вместо него pyqt_modules.append("QtHelp").

Запускаю скрипт еще раз и уже в окне Yakuake вижу заветный

Generating the C++ source for the QtHelp module. Creating the Makefile for the QtHelp module.

Проверяю наличие каталога QtHelp с исходниками — он есть.

Дальше дело за мелочами: запускаю долго make и make install и жду с чашечкой горячего кофе завершения сборки и установки.

Пробую переустановить Эрик5 - вуаля! Все установлено, IDE работает как часы! Конечно, это довольно грязный хак.

По-хорошему, стоило подобрать ключ к двери, а не вырубать эту самую дверь топором.

А ведь Петр Великий уже давно совершал подобные действия, кто нас теперь остановит? Теги: #python #pyqt4 #qthelp #eric5 #python #Qt

Вместе с данным постом часто просматривают: