了解jinja2.Packageloader()

时间:2019-06-02 13:53:45

标签: python jinja2 loader load-path

我有一个mkepub使用的(大多数正在工作的)python3程序。

由于我出于特定目的需要对其进行修改,因此我开始将其拉入目录树(完成后,我将发送一个“拉取请求”,因为我认为我的mod对其他人可能有用,但这不是问题)。

我当前的目录树是:

.
├── 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轰炸时出现以下错误:

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中进行尽可能小的更改(最好什么都不要!),以避免将来的Pull Request中出现问题。 OTOH,我的代码可以毫无问题地更改。

在此过程中,我还想了解Python3中更好的路径解析。

更新:显然,唯一的方法是将mkepub安装在venv中,然后在其中编辑文件(.../venv/lib/python3.7/site-packages/mkepub/...),这看起来很丑陋。还有另一种方法吗?

0 个答案:

没有答案