Как правильно настроить импорт PyQt5 на readthedocs? - PullRequest
0 голосов
/ 06 мая 2018

Создание документации sphinx для проекта Не удается импортировать PyQt5 ( журнал сборки ) с

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-docs'
qt.qpa.screen: QXcbConnection: Could not connect to display 
Could not connect to any X display.

В tox.ini необходимо следующее:

[testenv:docs]
# avoid QStandardPaths: XDG_RUNTIME_DIR not set
passenv = XDG_RUNTIME_DIR
# xvfb-run prevents Could not connect to any X display
commands = /usr/bin/xvfb-run sphinx-build --color -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html

Как это сделать на readthedocs?

Это тесно связано с PyQt 4-импортом в read-the-docs , который, к сожалению, сделалне содержат сообщений об ошибках.А PyQt5 устанавливается из пипса.

Примечания:

  • в расширенных настройках, Install your project inside a virtualenv using setup.py install проверено (но снятие отметки не помогло).
  • ссылка геоптика Снимок для следующих ориентиров составляет f33d233bf67bd7922ec864635e7589e7f4feb40f

Предположения

1.С фиктивным модулем

Возможно mocking PyQT5 мог бы работать.Но это выглядит немного громоздким .

Адаптация от этого ответа , добавление

import mock 
MOCK_MODULES = ['sip', 'PyQt5', 'PyQt5.QtGui', 'PyQt5.QtCore', 'PyQt5.QtWidgets']
sys.modules.update((mod_name, mock.MagicMock()) for mod_name in MOCK_MODULES)

к conf.py приводит к

    class _GRay(GCounterPart, QGraphicsPathItem):
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

2.Со встроенным sphinx autodoc_mock_imports

та же ошибка с более простой (добавляется только одна строка к conf.py)

autodoc_mock_imports = ['sip', 'PyQt5', 'PyQt5.QtGui', 'PyQt5.QtCore', 'PyQt5.QtWidgets']

3.С пользовательским Mock

Использование пользовательского Mock класса

class Mock(object):
    def __init__(self, *args, **kwargs):
        pass

    def __call__(self, *args, **kwargs):
        return Mock()

    @classmethod
    def __getattr__(cls, name):
        if name in ('__file__', '__path__'):
            return '/dev/null'
        elif name[0] == name[0].upper():
            mockType = type(name, (), {})
            mockType.__module__ = __name__
            return mockType
        else:
            return Mock()

MOCK_MODULES = ['sip', 'PyQt5', 'PyQt5.QtGui', 'PyQt5.QtCore', 'PyQt5.QtWidgets']
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = Mock()

дает

  File ".../geoptics/guis/qt/main.py", line 59, in <module>
    app = QCoreApplication.instance()
AttributeError: type object 'QCoreApplication' has no attribute 'instance'

Должно быть возможно переместить определение app/ извлечение материала с уровня модуля в тело функции, не выполняется при импорте модуля.

4.autodoc_mock_imports без множественного наследования

autodoc_mock_imports = ['sip', 'PyQt5', 'PyQt5.QtGui', 'PyQt5.QtCore', 'PyQt5.QtWidgets']

в conf.py, как во втором предварительном, но множественное наследование заменено декораторами.Изменения описаны в этом запросе на выдачу .

Теперь ошибка

geoptics.guis.qt.handles.LineHandle.reset_move:1:term not in glossary: move restrictions

, потому что класс геоптики _GScene(QGraphicsScene), в котором определен термин, был удаленsphinx, и его документация потеряна.


Комментарии, оставленные в соответствующих вопросах:

1 Ответ

0 голосов
/ 07 июня 2018

autodoc_mock_imports был зафиксирован в sphinx-1.7.5 .

В docs/conf.py добавить следующую строку:

autodoc_mock_imports = ['sip', 'PyQt5', 'PyQt5.QtGui', 'PyQt5.QtCore', 'PyQt5.QtWidgets']

Затем создайте файл docs / needs.txt одной строкой

sphinx>=1.7.5

и объявить docs/requirements.txt в проекте readthedocs admin>advanced settings>Requirements file.

К счастью, это не обходит setup.py, оно просто добавляет требование к версии sphinx-1.7.5.

...