我已经将我的 Flask Web 应用程序打包到一个可执行的 Python 压缩档案 ( zipapp ) 中。我在加载模板时遇到问题。Flask/Jinja2 无法找到模板。
为了加载模板,我使用jinja2.FunctionLoader了一个加载函数,该函数应该能够从可执行 zip 存档内部读取捆绑文件(在本例中为 Jinja 模板)(参考:python:可执行 zip 文件可以包含数据文件吗?)。然而,加载函数无法找到模板(参见:(1)代码中),即使模板可以从加载函数外部读取(参见:(2)代码中)。
这是目录结构:
??? src
??? __main__.py
??? templates
??? index.html
??? __init__.py # Empty file.
Run Code Online (Sandbox Code Playgroud)
src/__main__.py:
import pkgutil
import jinja2
from flask import Flask, render_template
def load_template(name):
# (1) ATTENTION: this produces an error. Why?
# Error message:
# FileNotFoundError: [Errno 2] No such file or directory: 'myapp'
data = pkgutil.get_data('templates', name)
return data …Run Code Online (Sandbox Code Playgroud) 我有一个模块,我将作为独立应用程序分发。该模块具有以下结构:
\n$ tree -L 2 ./\n./\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mymodule\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __main__.py\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fun.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mymodule.pyz\nRun Code Online (Sandbox Code Playgroud)\nmymodule/__main__.py包含下一行:
#!/usr/bin/env python\n\nimport argparse\nimport sys\nimport os.path\nfrom mymodule.fun import Fun\n\ndef main():\n sys.stdout.write(\'main is running\')\n Fun().run()\n\nif __name__ == \'__main__\':\n main()\nRun Code Online (Sandbox Code Playgroud)\nmymodule/fun.py包含下一行:
#!/usr/bin/env python\n\nimport sys\n\nclass Fun:\n """FUN"""\n\n def __init__(self):\n pass\n\n def run(self):\n sys.stdout.write("fun")\nRun Code Online (Sandbox Code Playgroud)\n如果我使用$ python -m mymodule输出运行模块\nmain is runningfun
但是如果我使用它创建一个独立的应用程序$ python -m zipapp -p "/usr/bin/evn python" mymodule并运行它,$ python mymodule.pyz我会收到错误
Traceback (most recent call last):\n …Run Code Online (Sandbox Code Playgroud)