【问题标题】:How to bundle python flask application into a standalone executable.如何将 python 烧瓶应用程序捆绑到独立的可执行文件中。
【发布时间】:2019-04-13 20:53:46
【问题描述】:

我正在为我的内部用户开发一些 python 应用程序。我们有一个使用 c# 和 wpf 开发的框架,每个用户在他们的系统上都有。现在让用户从该框架访问 python 应用程序的一个选项是要求每个用户在该系统中安装 python,这是不可能的。在 Google 进行一些研究后,我发现了 python 冷冻库

我能够捆绑或冻结张量流、django Matlab 应用程序并将其托管在我们的框架中,而无需使用 pyinstaller 要求用户安装 python。但对于烧瓶应用,我找不到合适的冰箱。

是否有用于烧瓶应用的冷冻机。我的要求是为我的烧瓶应用程序创建一个独立的 exe。我的构建服务器中有 python 3 和 python 2。

【问题讨论】:

  • 如果每个用户都需要在他们的系统上安装它,你为什么还要将它作为一个 Web 应用程序呢?
  • 目前我们公司没有使用docker和cloud。我们有很多用户通过聘请外部开发人员来开发自己的应用程序。但是,一旦他们开发了他们的应用程序,为了将其投入生产,他们必须等待数月。所以我们需要在我们的框架中支持所有类型的 python、.net、spa 等应用程序.. 就像我需要为所有类型的应用程序做好准备一样。这就是为什么。我们无法控制用户会给我们什么类型的应用程序。这将是一个临时解决方案。
  • 终于找到了解决方案。 .最终使用 cx_freeze 并且经过一些更改后能够使烧瓶工作
  • 如果您找到了可行的解决方案,那么您可以适当地发布您自己的解决方案并帮助其他人理解“一些更改”的含义

标签: python python-3.x python-2.7 pyinstaller


【解决方案1】:

下面描述的方法不使用冷冻机,适用于python3,适用于Mac和Linux

为了使用python2修改shebang和pip工具使用python2

这篇博文Bundling Python files into a stand-alone executable中提到了以下信息的重要部分(除了烧瓶示例和依赖项......)

有关 zip 应用程序的其他信息在The Python Zip Application Archive Format 中进行了解释

假设烧瓶应用程序如下:

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 What is this binary file? Where has the code gone?

【讨论】:

  • 感谢您的更新。会试一试,会告诉你的。
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多