如何将python flask应用程序捆绑为独立的可执行文件。

时间:2018-11-10 14:47:33

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

我正在为内部用户开发许多python应用程序。我们有一个使用c#和wpf开发的框架,每个用户在他们的系统上都有。现在,用户可以从该框架访问python应用程序,一种选择是让每个用户都无法在其中安装python。在Google进行了一些研究之后,我遇到了python冰箱库

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

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

1 个答案:

答案 0 :(得分:0)

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

为了使用python2,请将shebang and pip工具修改为使用python2

此博客文章Bundling Python files into a stand-alone executable

中提到了以下信息的重要部分(除了flask示例和依赖项...之外)。

与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']

出于可移植性的目的,将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 What is this binary file? Where has the code gone?