【问题标题】:How do I execute a Python program from within a Flask server?如何从 Flask 服务器中执行 Python 程序?
【发布时间】:2019-03-28 19:44:28
【问题描述】:

我正在创建一个包含各种 Python 程序的 Flask 服务器。我希望管理员能够从 Flask 应用程序中执行它们。例如,如果他们单击一个按钮,它将执行 Python 脚本。

目前,当我运行服务器时,Python 文件和 Flask 服务器按顺序执行。例如,首先执行 Python 文件,然后运行 ​​Flask 服务器(但仅在我终止 Python 程序之后)。

作为参考,Python 文件允许用户通过在窗口中双击图像在图像上绘制点。

routes.py

from app import app, db
from flask import Flask, request, render_template, session
import datasets

app.secret_key = app.config['SECRET_KEY']

/*--------------IRREVEVANT CODE BEGINS---------------*/

@app.route('/')
@app.route('/index')
def index():
    #Create connection session between SQLAlchemy database and server
    #Select ALL records in tables Lot
    #Store queries in data and push to INDEX template
    data = db.session.execute("SELECT * FROM Lot").fetchall()
    return render_template('index.html', data=data)

@app.route('/info/<lot_id>')
def info(lot_id):
    lotid = lot_id
    #Create connection session between SQLAlchemy database and server
    #Select records in table Spot based on LOT_ID parameter
    #Store queries in data and push to INFO template
    data = db.session.execute("SELECT * FROM Spot WHERE lot_id = :lotid;", {"lotid": lotid}).fetchall()
    return render_template('info.html', data=data)

/*------------IRRELEVANT CODE ENDS--------------*/

@app.route('/test')
def test():
    return datasets.click_and_crop()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port='8000', debug=True)

数据集.py

import cv2
import yaml
import numpy as np

file_path = 'parking_spots.yml'
img = cv2.imread('test1.jpg')
refPt = []
data = []
cropping = False

def yaml_loader(file_path):
    with open(file_path, "r") as file_descr:
        data = yaml.load(file_descr)
        return data

def yaml_dump(file_path, data):
    with open(file_path, "a") as file_descr:
        yaml.dump(data, file_descr)


def click_and_crop(event, x, y, flags, param):
    info = {'id': 0, 'points': []}
    global refPt, cropping

    if event == cv2.EVENT_LBUTTONDBLCLK:
        refPt.append((x,y))
        cropping = False

    if len(refPt) == 4:
        if data == []:
            if yaml_loader(file_path) != None:
                new_data = len(yaml_loader(file_path))
            else:
                new_data = 0
        else:
           if yaml_loader(file_path) != None:
               new_data = len(data) + len(yaml_loader(file_path))
           else:
               new_data = len(data)

        cv2.line(image, refPt[0], refPt[1], (0, 0, 255), 2)
        cv2.line(image, refPt[1], refPt[2], (0, 0, 255), 2)
        cv2.line(image, refPt[2], refPt[3], (0, 0, 255), 2)
        cv2.line(image, refPt[3], refPt[0], (0, 0, 255), 2)

        corner_1 = list(refPt[2])
        corner_2 = list(refPt[3])
        corner_3 = list(refPt[0])
        corner_4 = list(refPt[1])

        info['points'] = [corner_1, corner_2, corner_3, corner_4]
        info['id'] = new_data + 1
        data.append(info)
        refPt = []

image = cv2.resize(img, None, fx=0.6, fy=0.6)
clone = image.copy()
cv2.namedWindow("Click to mark points")
cv2.imshow("Click to mark points", image)
cv2.setMouseCallback("Click to mark points", click_and_crop)

while True:
    cv2.imshow("Click to mark points", image)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# data list into yaml file
if data != []:
    yaml_dump(file_path, data)
cv2.destroyAllWindows()

在这种情况下,我希望 Python 程序仅在您访问 localhost/test 网址时运行。 Flask 服务器将运行,然后,当单击将您带到该 url 的按钮时,Python 程序将同时运行直到其终止。

【问题讨论】:

  • 我开始写答案,但这里有太多的猜测。您的直接问题是import datasets。 Flask 与否,该导入在导入时执行该模块的所有代码。你需要看if __name__ == '__main__'
  • 那么,if __name__ == '__main__' 只是在函数上设置了一个阻尼器并阻止它在导入时运行?这似乎奏效了!谢谢。
  • 实际上,这似乎是一些 Python 文件的解决方案,但不是其他文件。我已经更新了上面的帖子。我是否正确实施了if __name__ == '__main__'

标签: python flask import


【解决方案1】:

对于发现自己在这里的任何人,我想出了解决这个特定问题的方法。

正如@roganjosh 提到的,import 语句一被解释就执行datasets 中的函数。为了防止这种情况,你需要在文件中包含if __name__ == "__main__",它告诉系统只在import没有调用指定的函数时才执行。

我的datasets.py 代码特别要提到的另一个“问题”是从服务器内部调用click_and_crop 不起作用,因为该函数需要参数。我通过创建main() 方法并改为调用它来缓解这种情况。完整的解决方案如下:

数据集.py

import cv2
import yaml
import numpy as np

img = cv2.imread('test1.jpg')
image = cv2.resize(img, None, fx=0.6, fy=0.6)
file_path = 'parking_spots.yml'
refPt = []
data = []

def yaml_loader(file_path):
    //contents of function

def yaml_dump(file_path, data):
    //contents of function

def click_and_crop(event, x, y, flags, param):
    //contents of function

def main():
    cropping = False
    clone = image.copy()
    cv2.namedWindow("Click to mark points")
    cv2.imshow("Click to mark points", image)
    cv2.setMouseCallback("Click to mark points", click_and_crop)
    while True:
        cv2.imshow("Click to mark points", image)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # data list into yaml file
    if data != []:
        yaml_dump(file_path, data)
    cv2.destroyAllWindows()
    hi = "done"

    return hi

if __name__ == "__main__":
    # stuff only to run when not called via 'import' here
    main()

routes.py

from app import app, db
from flask import Flask, request, render_template, session
import datasets

app.secret_key = app.config['SECRET_KEY']

@app.route('/')
@app.route('/index')
def index():
    //Contents of index()

@app.route('/info/<lot_id>')
def info(lot_id):
    //Contents of info()

@app.route('/test')
def test():
    return datasets.main()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port='8000', debug=True)

【讨论】:

  • 感谢@roganjosh 的帮助
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多