如何将Python Flask应用程序打包成独立可执行文件。

4
我正在为我的内部用户开发一些Python应用程序。我们有一个使用C#和WPF开发的框架,每个用户都在他们的系统上拥有它。现在,让用户从该框架访问Python应用程序的一个选项是要求每个用户在其系统上安装Python,这是不可能的。在Google上进行了一些研究后,我发现了Python冰冻库。
使用pyinstaller,我能够将TensorFlow、Django和Matlab应用程序捆绑或冻结,并在我们的框架中托管它们,而无需要求用户安装Python。但对于Flask应用程序,我找不到适当的冰箱。
是否有任何适用于Flask应用程序的冰箱。我的要求是为我的Flask应用程序创建一个独立的exe文件。我在构建服务器上同时拥有Python 3和Python 2。

如果每个用户都需要在他们的系统上安装它,为什么你会将它设计成一个 Web 应用呢? - Daniel Roseman
目前我们公司没有使用Docker和云技术。我们有很多用户通过雇佣外部开发人员来开发自己的应用程序。但是一旦他们开发出应用程序,要将其投入生产需要等待数月之久。因此,我们需要在我们的框架中支持所有类型的Python、.NET、SPA等应用程序...就像我需要为所有类型的应用程序做好准备。这就是为什么我们无法控制用户会给我们什么类型的应用程序。而这只是一个临时解决方案。 - anoop
终于找到解决方案了。最后使用了 cx_freeze,经过一些更改后,成功让 Flask 工作起来。 - anoop
3
如果您找到了有效的解决方案,公开分享您的解决方案并帮助其他人理解“一些更改”意味着什么,这是很公正的。 - user11696358
1个回答

2
下面所描述的方法不使用冰箱,适用于Python3,并可在Mac和Linux上运行。
如果要使用Python2,请修改shebang和pip工具以使用Python2。
除了flask示例和依赖项之外,以下信息的大部分内容在此博客文章中提到:将Python文件打包为独立可执行文件
有关zip应用程序的其他信息在Python Zip应用程序归档格式中进行了解释。
假设Flask应用程序如下:
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']

安装 Flask 依赖项到应用程序文件夹以实现可移植性。
$ 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 这是什么二进制文件?代码去哪了?


谢谢更新。我会尝试并告诉你结果。 - anoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接