Проблемы со сборкой PyQt5 в Ubuntu 14.04

У меня возникли проблемы со сборкой PyQt5 на Ubuntu 14.04. Я работаю с некоторым кодом, который сильно зависит от Python 2.7; поэтому я не могу использовать пакеты python3 из репозитория Ubuntu. Дальнейший поиск пакетов Ubuntu показывает, что существуют пакеты dev и doc для Python 2 pyqt5. Но ничего, чтобы установить библиотеки, необходимые для написания кода.

Это привело меня к созданию пользовательской сборки для PyQt5. Я получил исходный код версии 5.5 отсюда: https://www.riverbankcomputing.com/software/pyqt/download5, и я использую sip, предоставленный репозиториями Ubuntu (для установки kubuntu-desktop требуется sip).

Я читал, что легко иметь несовпадающие версии sip, поэтому я сделал следующую проверку:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sip
>>> print(sip, sip.SIP_VERSION_STR)
(<module 'sip' from '/usr/lib/python2.7/dist-packages/sip.so'>, '4.16.9')

И:

$ sip -V
4.16.9

Также я использую инструменты Qt5, предоставленные репозиториями Ubuntu. Это включало установку qtdeclarative5-* (вероятно, излишне) и qt5-default. Вот некоторая информация о qmake:

qmake --version
QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu

В настоящее время у меня установлен PyQt4, и я прочитал в примечаниях по установке, что это будет нормально, если они оба скомпилированы для одной и той же версии sip.

После загрузки я распаковал архив и попытался собрать его следующим образом:

sudo ln -s  /usr/include/python2.7  /usr/local/include/python2.7
python configure.py --sip-incdir=/usr/include/python2.7/
make

Выходные данные конфигурации указывают на правильную версию sip, и я получаю следующие (по-видимому) ошибки компиляции, связанные с sip, от make:

make[1]: Entering directory `~/Downloads/PyQt-gpl-5.5/QtWebKit'
g++ -c -m64 -pipe -fno-exceptions -O2 -Wall -W -D_REENTRANT -fPIC -DSIP_PROTECTED_IS_PUBLIC -Dprotected=public -DQT_NO_DEBUG -DQT_PLUGIN -DQT_WEBKIT_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/python2.7 -I/usr/include/qt5 -I/usr/include/qt5/QtWebKit -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o sipQtWebKitQWebSecurityOrigin.o sipQtWebKitQWebSecurityOrigin.cpp
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘PyObject* meth_QWebSecurityOrigin_addAccessWhitelistEntry(PyObject*, PyObject*)’:
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:9: error: ‘SubdomainSetting’ is not a member of ‘QWebSecurityOrigin’
         QWebSecurityOrigin::SubdomainSetting a2;
         ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:46: error: expected ‘;’ before ‘a2’
         QWebSecurityOrigin::SubdomainSetting a2;
                                              ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:387:214: error: ‘a2’ was not declared in this scope
         if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2))
                                                                                                                                                                                                                      ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:389:21: error: ‘class QWebSecurityOrigin’ has no member named ‘addAccessWhitelistEntry’
             sipCpp->addAccessWhitelistEntry(*a0,*a1,a2);
                     ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘PyObject* meth_QWebSecurityOrigin_removeAccessWhitelistEntry(PyObject*, PyObject*)’:
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:9: error: ‘SubdomainSetting’ is not a member of ‘QWebSecurityOrigin’
         QWebSecurityOrigin::SubdomainSetting a2;
         ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:46: error: expected ‘;’ before ‘a2’
         QWebSecurityOrigin::SubdomainSetting a2;
                                              ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:420:214: error: ‘a2’ was not declared in this scope
         if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2))
                                                                                                                                                                                                                      ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:422:21: error: ‘class QWebSecurityOrigin’ has no member named ‘removeAccessWhitelistEntry’
             sipCpp->removeAccessWhitelistEntry(*a0,*a1,a2);
                     ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘void* init_type_QWebSecurityOrigin(sipSimpleWrapper*, PyObject*, PyObject*, PyObject**, PyObject**, PyObject**)’:
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: error: no matching function for call to ‘QWebSecurityOrigin::QWebSecurityOrigin(const QUrl&)’
             sipCpp = new QWebSecurityOrigin(*a0);
                                                ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: note: candidates are:
In file included from ~/Downloads/PyQt-gpl-5.5/sip/QtWebKit/qwebsecurityorigin.sip:26:0:
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note: QWebSecurityOrigin::QWebSecurityOrigin(QWebSecurityOriginPrivate*)
     QWebSecurityOrigin(QWebSecurityOriginPrivate* priv);
     ^
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note:   no known conversion for argument 1 from ‘const QUrl’ to ‘QWebSecurityOriginPrivate*’
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note: QWebSecurityOrigin::QWebSecurityOrigin(const QWebSecurityOrigin&)
     QWebSecurityOrigin(const QWebSecurityOrigin& other);
     ^
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note:   no known conversion for argument 1 from ‘const QUrl’ to ‘const QWebSecurityOrigin&’
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: At global scope:
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:516:48: error: ‘AllowSubdomains’ is not a member of ‘QWebSecurityOrigin’
     {sipName_AllowSubdomains, static_cast<int>(QWebSecurityOrigin::AllowSubdomains), 21},
                                                ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:517:51: error: ‘DisallowSubdomains’ is not a member of ‘QWebSecurityOrigin’
     {sipName_DisallowSubdomains, static_cast<int>(QWebSecurityOrigin::DisallowSubdomains), 21},
                                                   ^
make[1]: *** [sipQtWebKitQWebSecurityOrigin.o] Error 1
make[1]: Leaving directory `~/Downloads/PyQt-gpl-5.5/QtWebKit'
make: *** [sub-QtWebKit-make_first-ordered] Error 2

В результате я могу выполнить установку и получить некоторые ожидаемые функции; однако мне не хватает некоторых необходимых функций с виджетами WebKit. Я надеюсь, что предоставил достаточно информации, чтобы описать, где я застрял. Я просто стесняюсь копаться в коде; однако я предполагаю, что ответ на самом деле намного проще.

Заранее спасибо!


person Joseph    schedule 18.08.2015    source источник
comment
Вы установили пакеты разработки для libqt5webkit? (PS: в Ubuntu-14.10 есть пакеты pyqt5 для python2).   -  person ekhumoro    schedule 19.08.2015
comment
Я установил libqt5webkit из управления пакетами. Я также заметил некоторые вещи из моих поисков: 1.) Он появится в цепочке электронной почты, которую я видел (riverbankcomputing.com/pipermail/pyqt/2014-May/034175.html), что пакеты Python 2 для PyQt5 намеренно отсутствовали 2.) похоже, что в репозиториях Ubuntu есть проблемы с версией Qt5.   -  person Joseph    schedule 19.08.2015
comment
Я уже говорил вам, что пакеты теперь доступны в ubuntu-14.10. Если вам трудно принять совет, убедитесь сами . И, как я уже сказал, вам нужны пакеты dev для qt webkit, а не только библиотеки.   -  person ekhumoro    schedule 19.08.2015
comment
Вау, в моем комментарии не было неуважения. У меня жесткая зависимость от Ubuntu 14.04, и мне не разрешено включать дополнительные репозитории. Итак, я ограничен исходными и стандартными репозиториями Ubuntu 14.04. Я также установил пакеты dev некоторое время назад. Кроме того, я должен упомянуть, что преднамеренно отсутствует в Ubuntu 14.04. Я знаю, что в более новых дистрибутивах есть пакеты 14.04, которых нет: packages.ubuntu.com/trusty/python   -  person Joseph    schedule 19.08.2015


Ответы (1)


So,

Я начал копаться в исходном пакете в поисках файла, который не может быть скомпилирован. В каталоге sip есть sip-файл QWebSecurityOrigin, который содержит следующее:

%If (Qt_5
qmake --version
QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu
0 -) enum SubdomainSetting { AllowSubdomains, DisallowSubdomains, }; %End

Я могу разумно ожидать, что этот код будет включен, поскольку qmake сообщает мне следующее:

qmake --version
QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu

Затем я хотел заглянуть в файл qwebsecurityorigin.h, предоставленный Qt, чтобы узнать, может ли ошибка появиться оттуда. Мой установлен здесь: /usr/include/qt5/QtWebKit/qwebsecurityorigin.h

#ifndef _WEBSECURITYORIGIN_H_
#define _WEBSECURITYORIGIN_H_

#include <QtCore/qurl.h>
#include <QtCore/qshareddata.h>

#include "qwebkitglobal.h"

namespace WebCore {
    class SecurityOrigin;
    class ChromeClientQt;
}

class QWebSecurityOriginPrivate;
class QWebDatabase;
class QWebFrame;

class QWEBKIT_EXPORT QWebSecurityOrigin {
public:
    static QList<QWebSecurityOrigin> allOrigins();
    static void addLocalScheme(const QString& scheme);
    static void removeLocalScheme(const QString& scheme);
    static QStringList localSchemes();

    ~QWebSecurityOrigin();

    QString scheme() const;
    QString host() const;
    int port() const;

    qint64 databaseUsage() const;
    qint64 databaseQuota() const;

    void setDatabaseQuota(qint64 quota);
    void setApplicationCacheQuota(qint64 quota);

    QList<QWebDatabase> databases() const;

    QWebSecurityOrigin(const QWebSecurityOrigin& other);
    QWebSecurityOrigin &operator=(const QWebSecurityOrigin& other);
private:
    friend class QWebDatabase;
    friend class QWebFrameAdapter;
    friend class WebCore::ChromeClientQt;
    QWebSecurityOrigin(QWebSecurityOriginPrivate* priv);

private:
    QExplicitlySharedDataPointer<QWebSecurityOriginPrivate> d;
};

Обратите внимание, что перечисление не определено. Поиск Qt 5.5 предполагает, что перечисление должно быть там: http://doc.qt.io/qt-5/qwebsecurityorigin.html#SubdomainSetting-enum

Наконец, вспомнил, что я устанавливал libqt5webkit отдельно от основной массы библиотек Qt; Итак, я проверил версию пакета:

dpkg -s libqt5webkit5
Package: libqt5webkit5
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 34225
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Multi-Arch: same
Source: qtwebkit-opensource-src
Version: 5.1.1-1ubuntu8

Этот вывод почти идентичен для пакета dev. Таким образом, кажется, что основная часть дистрибутива Qt5 в репозиториях находится в версии, отличной от версии webkit. Кроме того, если QWebKit находится в версии 5.1.1, это объясняет, почему перечисление отсутствует, поскольку файл sip, похоже, предполагает, что это было добавлено в 5.2.0.

Поэтому моим решением было загрузить и установить Qt 5.5 с веб-сайта Qt с помощью автоматического установщика (запущенного с помощью sudo, с использованием значений по умолчанию). Затем я начал заново с исходного кода PyQt5, удалив каталог сборки и снова распаковав исходный код:

python configure.py --sip-incdir=/usr/include/python2.7/ --qmake=/opt/Qt/5.5/gcc_64/bin/qmake 
make
sudo make install 

Лицензии несовместимы; однако быстрый поиск в скрипте pyqt5 configure.py с использованием вывода ошибок может дать некоторое представление о настройке и компиляции кода.

person Joseph    schedule 19.08.2015