0

我有一个使用mkepub的(主要是工作的)python3 程序。

因为我需要为我的特定目的修改它,所以我开始将它拉到我的目录树中(完成后我会发送一个拉取请求,因为我认为我的模块可能对其他人有用,但这不是问题)。

我当前的目录树是:

.
├── 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

我以这种方式使用mkepubfrom :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'))

这会在程序启动时(同时importing)发生以下错误:

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/...),这看起来很丑陋。还有其他方法吗?

4

0 回答 0