【发布时间】: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__'?