Понимание jinja2.Packageloader () - PullRequest
0 голосов
/ 02 июня 2019

У меня есть (в основном работающая) программа на python3, использующая mkepub .

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

Мое текущее дерево каталогов:

.
├── markright
│   ├── book_parser.py
│   ├── docx_emitter.py
│   ├── emitter.py
│   ├── epub_emitter.py
│   ├── html_emitter.py
│   ├── __init__.py
│   ├── mkepub
│   │   ├── __init__.py
│   │   ├── mkepub.py
│   │   ├── templates
│   │   │   ├── container.xml
│   │   │   ├── cover.xhtml
│   │   │   ├── package.opf
│   │   │   ├── page.xhtml
│   │   │   ├── toc.ncx
│   │   │   └── toc.xhtml
│   │   └── tests
├── markright.py

Я использую mkepub из epub_emitter.py таким образом:

from . import mkepub  # <-- here I get problems
...
epub = mkepub.Book(**kwargs)

, который импортирует ./mkepub/__init__.py:

from .mkepub import Book  # <-- here I get problems

... что в итоге приводит к проблемному коду:

import jinja2
...
env = jinja2.Environment(loader=jinja2.PackageLoader('mkepub'))

Это бомбы при запуске программы (при import ing) со следующей ошибкой:

Traceback (most recent call last):
  File "/home/mcon/Documents/Libro/sigil/markright/venv/lib/python3.7/site-packages/setuptools-40.8.0-py3.7.egg/pkg_resources/__init__.py", line 359, in get_provider
KeyError: 'mkepub'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mcon/Documents/Libro/sigil/markright/markright.py", line 1, in <module>
    from markright import *
  File "/home/mcon/Documents/Libro/sigil/markright/markright/__init__.py", line 4, in <module>
    from .epub_emitter import EPUBemitter
  File "/home/mcon/Documents/Libro/sigil/markright/markright/epub_emitter.py", line 1, in <module>
    from . import mkepub
  File "/home/mcon/Documents/Libro/sigil/markright/markright/mkepub/__init__.py", line 1, in <module>
    from .mkepub import Book
  File "/home/mcon/Documents/Libro/sigil/markright/markright/mkepub/mkepub.py", line 49, in <module>
    env = jinja2.Environment(loader=jinja2.PackageLoader('mkepub'))
  File "/home/mcon/Documents/Libro/sigil/markright/venv/lib/python3.7/site-packages/jinja2/loaders.py", line 224, in __init__
    provider = get_provider(package_name)
  File "/home/mcon/Documents/Libro/sigil/markright/venv/lib/python3.7/site-packages/setuptools-40.8.0-py3.7.egg/pkg_resources/__init__.py", line 361, in get_provider
ModuleNotFoundError: No module named 'mkepub'

Обратите внимание, это работает, если я import то же самое mkepub (я еще не изменял) из системного каталога (или venv).

Чего мне не хватает?

Конечно, я бы хотел изменить как можно меньше (в идеале, ничего!) В mkepub, чтобы избежать проблем в будущем запросе на извлечение. OTOH я могу без проблем изменить свой код.

В процессе я также хотел бы понять лучшее разрешение пути в Python3.

ОБНОВЛЕНИЕ: очевидно, единственный способ - установить mkepub в venv и затем отредактировать файлы внутри него (.../venv/lib/python3.7/site-packages/mkepub/...), что выглядит очень некрасиво. Есть ли другой способ?

...