问题描述
我正在使用 pyinstaller 打包它。我正在执行以下操作来创建我的 pyinstaller 脚本
mkdir ./src/static
cp -r ./venv/lib/python3.8/site-packages/flasgger/ui2/templates/. ./src/templates
cp -r ./venv/lib/python3.8/site-packages/flask_admin/templates/. ./src/templates
cp -r ./venv/lib/python3.8/site-packages/flasgger/ui2/static/. ./src/static
cp -r ./venv/lib/python3.8/site-packages/flask_admin/static/. ./src/static
pyinstaller \
--onefile \
--add-data "./src/templates:templates" \
--add-data "./src/static:static" \
--add-data "./src/swagger:swagger" \
--paths ".:./src/:./test:./venv" \
./src/app.py
我的 app.py
执行以下操作
if getattr(sys,'frozen',False):
template_folder = os.path.join(sys._MEIPASS,'templates')
static_folder = os.path.join(sys._MEIPASS,'static')
app = Flask(__name__,template_folder=template_folder,static_folder=static_folder)
else:
app = Flask(__name__)
我看到 flasgger
视图及其静态文件可以正常运行。但是,flask_admin
静态文件没有得到提供,并且出现 404 错误。
可能是什么原因?
解决方法
pyinstaller 构建应用程序时,一般都会包含实际调用的文件。
在flask_admin中,静态文件是从HTML文件中访问的,其中pyinstaller将静态文件识别为未使用的文件,并且不会将其包含在构建文件中。
在这种情况下,您不能从站点包中导入包。
你必须在你运行应用程序的地方放置flask_admin包,并从本地导入flask_admin。
例如: 考虑这个应用程序结构
project
|--- app
|--- __init__.py
|--- ... (other files)
|--- flask_admin
|--- run.py
init.py
from flask import Flask
from flask_admin import Admin
def create_app():
app = Flask(__name__)
admin = Admin(app)
...
...
return app
run.py
from app import creare_app
if __name__ == "__main__":
app = create_app()
app.run()
这里:
- 不应在环境中安装flask_admin。
- flask_admin 包应放置在您运行应用程序的位置。 (从 git 下载 flask_admin)。
- 在使用 pyinstaller 构建应用程序时,还应添加整个 flask_admin 包。
示例命令:
pyinstaller --onedir --add-data "/dir/app;app/" --add-data "/dir/flask_admin;flask_admin/" run.py
你可以找到一个例子here