首页 > 解决方案 > 无法再在 jinja2 中创建 packageloader

问题描述

当我尝试在 Jinja2 中创建 packageLoader 时:

loader=jinja2.PackageLoader( 'cyan', 'templates')

我收到一个错误:

In [2]: loader=PackageLoader( 'cyan', 'templates')                                                      
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/work/venvs/CYAN/lib/python3.7/site-packages/pkg_resources/__init__.py in get_provider(moduleOrReq)
    358     try:
--> 359         module = sys.modules[moduleOrReq]
    360     except KeyError:

KeyError: 'cyan'

During handling of the above exception, another exception occurred:

ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-2-9f5a5a8d0f55> in <module>
----> 1 loader=PackageLoader( 'cyan', 'templates')

~/work/venvs/CYAN/lib/python3.7/site-packages/jinja2/loaders.py in __init__(self, package_name, package_path, encoding)
    222         from pkg_resources import DefaultProvider, ResourceManager, \
    223                                   get_provider
--> 224         provider = get_provider(package_name)
    225         self.encoding = encoding
    226         self.manager = ResourceManager()

~/work/venvs/CYAN/lib/python3.7/site-packages/pkg_resources/__init__.py in get_provider(moduleOrReq)
    359         module = sys.modules[moduleOrReq]
    360     except KeyError:
--> 361         __import__(moduleOrReq)
    362         module = sys.modules[moduleOrReq]
    363     loader = getattr(module, '__loader__', None)

ModuleNotFoundError: No module named 'cyan'

这用于工作。我还没有弄清楚最近的变化可能会导致这种情况。有一个模板目录,它有init .py。

这个:使用 Jinja2 的 HTML 模板没有命名您的应用程序的模块看起来像同样的问题,但建议是不要使用 PackageLoader。由于我的代码 2 周前工作,我担心我破坏了其他东西,这只是一个症状,所以我宁愿不只是让症状消失,如果我能弄清楚实际发生了什么。

更奇怪的是,“青色”是程序的名称。在文档中,它使用“yourapplication”,所以我认为它可以是任何字符串,并在内部使用它来命名事物......

标签: pythonjinja2

解决方案


根据错误显示:

359--> 模块=系统模块[模块或请求]

同一行有一个错误,因为当我们执行以下代码时:

>> import sys
>> module = sys.modules

变量模块是key:<ModuleName>和的字典value:<ModuleObject>

根据您的代码,您试图cyan从上面的字典对象中获取模块,但没有任何键可以与您的模块名称“青色”匹配,因为cyan.py它既不在本地目录中,也不在 SYSTEM-PATH 中。

为 python创建一个cyan.py在同一目录或模块路径中命名的模块将在您的字典对象中再获取一个模块,现在您可以使用sys.modules['cyan'].


推荐阅读