python - 如何将 python 烧瓶应用程序捆绑到独立的可执行文件中。
问题描述
我正在为我的内部用户开发一些 python 应用程序。我们有一个使用 ac# 和 wpf 开发的框架,每个用户在他们的系统上都有。现在让用户从该框架访问 python 应用程序的一个选项是要求每个用户在该系统中安装 python,这是不可能的。在谷歌进行一些研究后,我遇到了 python freezer 库
我能够捆绑或冻结张量流、django Matlab 应用程序并将其托管在我们的框架中,而无需要求用户使用 pyinstaller 安装 python。但对于烧瓶应用,我找不到合适的冰箱。
是否有用于烧瓶应用的冷冻机。我的要求是为我的烧瓶应用程序创建一个独立的 exe。我的构建服务器中有 python 3 和 python 2。
解决方案
下面描述的方法不使用冷冻机,适用于 python3 并在 Mac 和 Linux 上工作
为了使用python2修改shebang和pip工具使用python2
这篇博文将 Python 文件捆绑到独立的可执行文件中提到了以下信息的重要部分(除了烧瓶示例和依赖项......)
The Python Zip Application Archive Format中解释了与 zip 应用程序相关的其他信息
让我们假设烧瓶应用程序如下:
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/')
def root():
static_page='''
<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
'''
return static_page
@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
user = request.args.get('nm')
return redirect(url_for('success',name = user))
def main():
app.run()
它将被命名为moosh1.py。
现在构建以下文件夹层次结构:
app/
| __main__.py
| moosh/
| __init__.py
| moosh1.py
其中 __main__.py 如下:
import sys
import moosh
if __name__ == '__main__':
print("hello moosh1 - running on python %s.%s" %
(sys.version_info[0], sys.version_info[1]))
moosh.main()
moosh/__init__.py 如下:
from .moosh1 import main
__all__ = ['main']
出于便携性目的,将烧瓶依赖项安装到 app 文件夹中
$ cd app
$ pip3 install flask --target ./
$ cd ..
现在压缩它
$ cd app
$ zip -r ../app.zip *
$ cd ..
现在添加 shebang 并使我们的独立应用程序可执行
$ echo '#!/usr/bin/env python3' | cat - app.zip > app
$ chmod +x app
就是这样,app是一个独立的 python 程序,具有所有相关的依赖项
更精细的程序将需要更多的调整,并且可能不适用于开箱即用的这种方法。
我发现使用这样的方案的最大程序是 youtube-dl这个二进制文件是什么?代码哪里去了?
推荐阅读
- python - 将 CSV 文件转换为设置然后列出唯一列表但得到 TypeError: unhashable type: 'list'
- php - Symfony Doctrine 很多疑问——是正常的吗?
- java - 缺少 Java Spring 所需的请求正文
- oracle - 如何使 EfCore 从 ?? 生成 COALESCE (空合并)运算符每个类型?
- gcc - 原子困境:它甚至可以在任何可用情况下替换互斥锁吗?
- azure - Azure ADLS Gen2 监控文件的 ACL 权限
- c++ - 如何用自己的程序打包 Opencv 并将其处理到新机器上
- android-studio - 有没有办法测量和比较部署在手机中的深度学习模型的电池消耗?
- python - Flask Reverse 布局模式以从多个组件/模板创建页面
- docker - GO / Golang 在 Docker 问题上运行项目 - 找不到包(内部文件夹)