我有一个使用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
我以这种方式使用mkepub
from :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
以避免在未来的 Pull Request 中出现问题。OTOH 我可以毫无问题地更改我的代码。
在此过程中,我还想了解 Python3 中更好的路径解析。
更新:显然,唯一的方法是安装mkepub
在其中venv
,然后在其中编辑文件(.../venv/lib/python3.7/site-packages/mkepub/...
),这看起来很丑陋。还有其他方法吗?