通过os.execl

时间:2018-03-10 03:42:28

标签: python flask

如果在配置文件中更改了服务器端口,我想要重启一个简单的烧瓶应用程序。我有以下代码:

#!/usr/bin/env python

from flask import Flask, jsonify
import sys, time, os

app = Flask(__name__,static_url_path='')

HTTPPort = 8080

#------------------------------------------------------------
@app.route("/cmd/<command>")
def command(command):

    if command == "restart":
        Reload()
    return jsonify("OK")

#------------------------------------------------------------
def Reload():
    # reload python script
    os.execl(sys.executable, 'python', __file__, *sys.argv[1:])

#------------------------------------------------------------
if __name__ == "__main__":

    # load options from file, which change HTTPPort value
    # LoadConfig()
    while True:
        try:
            app.run(host="0.0.0.0", port=HTTPPort)
        except Exception as e1:
            print("Error in app.run:" + str(e1))
            time.sleep(2)
            Reload()

问题是当调用os.execl时会重新加载python脚本但是app.run失败并且“[Errno 98]地址已经在使用”

加载应用程序后,您可以通过输入浏览器的地址窗口在浏览器中触发命令例程:8080 / cmd / restart。这将导致烧瓶应用程序接受“重启”命令,这将导致调用os.exec()。此时,应用程序将终止并重新加载。在重新加载app.run()将通过异常错误输出“Address in in use”,它将尝试每2秒重新加载一次,每次都会出现相同的错误。

我尝试在app.run参数列表中设置reload = True但是这不允许更改端口。这可能是完成还是我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

在尝试自己之后完全不同的答案。我想你可能要做两个部分的过程。

首先保存所需的端口号,秒更新文件的时间戳,以便内置的重新加载器为您重新启动应用程序。

将其与重定向结合到您的新地址,操作几乎是无缝的。这不会检查端口号是否正在使用,因此如果您选择一个现有端口,您可能已经死了,但是代码非常简单。

#!/usr/bin/env python

from flask import Flask, redirect
import os
import configparser

config = configparser.ConfigParser()
config.read('portnumber.ini')

app = Flask(__name__,static_url_path='')

HTTPPort = config['MAIN'].getint('portnumber')


def touchMe():
    with open(__file__, 'a'):
        print(" - setting timestamp of " + __file__ )
        os.utime(__file__, None)


@app.route("/newport/<newport>")
def changeRoute(newport):
    HTTPPort = newport
    name = newport
    config['MAIN']['portnumber'] = newport
    with open('portnumber.ini', 'w') as configfile:
        config.write(configfile)
    touchMe()
    newurl = "http://localhost:" + HTTPPort + "/"
    print("Redirecting to " + newurl)

    return redirect(newurl, code=302)


#------------------------------------------------------------
if __name__ == "__main__":

    # load options from file, which change HTTPPort value
    # LoadConfig()
    while True:
        app.run(host="0.0.0.0", port=HTTPPort, debug=True, use_reloader=True)