У меня есть (в основном работающая) программа на 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/...
), что выглядит очень некрасиво. Есть ли другой способ?