Создание документации 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, и его документация потеряна.
Комментарии, оставленные в соответствующих вопросах: