Ошибка при создании документов с помощью Sphinx и KivyMD

#python #kivy #python-sphinx #kivymd

Вопрос:

Я создаю приложение с помощью KivyMD на python, теперь я хочу сделать быструю документацию с помощью Sphinx. Но каждый раз, когда я использую «сделать html» в командной строке, я получаю следующую ошибку:

     WARNING: autodoc: failed to import module 'test'; the following exception was raised:
Traceback (most recent call last):
  File "c:usersiuryckanaconda3libsite-packagessphinxextautodocimporter.py", line 70, in import_module
    return importlib.import_module(modname)
  File "c:usersiuryckanaconda3libimportlib__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:UsersiuryckOneDriveDocumentsVSCodetesttest.py", line 1, in <module>
    from kivymd.app import MDApp
  File "c:usersiuryckanaconda3libsite-packageskivymdapp.py", line 62, in <module>
    class MDApp(App, FpsMonitoring):
  File "c:usersiuryckanaconda3libsite-packageskivymdapp.py", line 63, in MDApp
    theme_cls = ObjectProperty(ThemeManager())
  File "c:usersiuryckanaconda3libsite-packageskivymdtheming.py", line 860, in __init__
    self.rec_shadow = Atlas(f"{images_path}rec_shadow.atlas")
  File "c:usersiuryckanaconda3libsite-packageskivyatlas.py", line 188, in __init__
    self._load()
  File "c:usersiuryckanaconda3libsite-packageskivyatlas.py", line 216, in _load
    ci = CoreImage(subfilename)
  File "c:usersiuryckanaconda3libsite-packageskivycoreimage__init__.py", line 561, in __init__
    self.filename = arg
  File "c:usersiuryckanaconda3libsite-packageskivycoreimage__init__.py", line 754, in _set_filename
    image = ImageLoader.load(
  File "c:usersiuryckanaconda3libsite-packageskivycoreimage__init__.py", line 463, in load
    raise Exception('Unknown <%s> type, no loader found.' % ext)
Exception: Unknown <png> type, no loader found.
 

Как вы можете видеть, Sphinx может найти модуль Kivy, а также найти код. Так что это не проблема с каталогом или окружающей средой, как я часто видел.

Его можно просто воспроизвести, установив KivyMD и Sphinx и используя следующий код:

 from kivymd.app import MDApp

if __name__ == "__main__":
    print('Hello World')
 

Затем выполните обычный процесс документирования sphinx на нем.

Есть какие-нибудь идеи?

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

1. Я не могу повторить. Я запустил ваш код после того, как убедился, что Sphinx и KivyMD были установлены, запустил sphinx-quickstart все настройки по умолчанию, затем запустил make html , и все сработало нормально. Это на Win10 с Cygwin.

2. @MattDMo Вы установили какие-либо зависимости или просто установили оба pip? Я тоже на выигрыше 10. Может быть, это проблема с анакондой? Я запустил терминал из терминала anaconda, убедился, что он находится в той же среде и все такое.

3. У меня уже были установлены Sphinx и Kivy с зависимостями, мне просто нужно было установить KivyMD, и все его зависимости уже были там. Я не использую Анаконду, поэтому не знаю, имеет ли это какое-либо отношение к этому. Я бы удалил оба и попытался снова с нуля, заставляя обновлять зависимости.

4. Кроме того, просто еще раз взглянув на вашу ошибку, я бы рекомендовал переименовать ваш файл из test.py в kivymd_test.py или что-то в этом роде. Похоже, что-то пытается импортировать test модуль, а вместо этого импортирует ваш файл.

5. @MattDMo Я думаю, что вы забыли sphinx-apidoc-o [OUTPUT_DIR] [INPUT_DIR], иначе он не читает ваш код. Я сделал, как вы сказали, и также не получил ошибок, но код не был задокументирован

Ответ №1:

Хорошо, я нашел 2 решения, ошибка, насколько я знаю, исходит от kivymd v0.104.1, так что вы можете:

1 — Обновите KivyMD до версии 0.104.2

Но, если вы много работали в таком проекте, как я, у вас будет небольшой сердечный приступ, когда вы заметите, что многие визуальные эффекты изменились с одной версии на другую, многое выглядит по-другому, и вы, вероятно, этого не хотите, поэтому мое решение проблемы было…

2 — Измените код MDApp в /kivymd/app.py

В версии 0.104.1 класс MDApp должен выглядеть следующим образом

 class MDApp(App, FpsMonitoring):
    theme_cls = ObjectProperty(ThemeManager())
 

Удалите строку ThemeManager, затем добавьте в класс следующее

 def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.theme_cls = ThemeManager()
 

Так что все это должно выглядеть так:

 class MDApp(App, FpsMonitoring):
    theme_cls = ObjectProperty()
            
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.theme_cls = ThemeManager()
 

В случае, если вы задаетесь вопросом, безопасно ли это и не приведет ли к ошибкам в будущем, /kivymd/app.py в версии 0.104.2 выглядит именно так (отсюда и возникла идея сделать это). Я запустил свое приложение, открыл кучу страниц, а что нет, проблем не возникло, и визуальные эффекты остались прежними.