如何从Flask服务器中执行Python程序?
我正在创建一个包含各种Python程序的Flask服务器。我希望管理员能够从Flask应用程序中执行它们。例如,如果他们单击一个按钮,它将执行Python脚本 目前,当我运行服务器时,Python文件和Flask服务器按顺序执行。如中所示,首先执行Python文件,然后运行Flask服务器(但只有在我终止Python程序之后) 作为参考,Python文件允许用户通过在窗口中双击图像来绘制图像上的点 routes.py如何从Flask服务器中执行Python程序?,python,flask,import,Python,Flask,Import,我正在创建一个包含各种Python程序的Flask服务器。我希望管理员能够从Flask应用程序中执行它们。例如,如果他们单击一个按钮,它将执行Python脚本 目前,当我运行服务器时,Python文件和Flask服务器按顺序执行。如中所示,首先执行Python文件,然后运行Flask服务器(但只有在我终止Python程序之后) 作为参考,Python文件允许用户通过在窗口中双击图像来绘制图像上的点 routes.py from app import app, db from flask impo
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)
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)
在本例中,我希望Python程序仅在进入
localhost/test
url时运行。Flask服务器将运行,然后,当点击一个按钮将您带到该url时,Python程序将同时运行,直到其终止。对于发现自己在这里的任何人,我找到了这个特定问题的解决方案
正如@roganjosh所提到的,import
语句一经解释就执行数据集中的函数。为了防止出现这种情况,您需要在文件中包含if uuuuu name uuu==“\uuuuuuu main\uuuuuu”
,它告诉系统仅在导入
未调用指定函数时执行该函数
我的datasets.py
代码中要特别提到的另一个“问题”是,从服务器内部调用click\u和\u crop
不起作用,因为该函数需要参数。我通过创建一个main()
方法并调用它来缓解这种情况。完整的解决方案如下:
datasets.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()
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']
/*--------------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)
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)
从应用程序导入应用程序,数据库
从烧瓶导入烧瓶、请求、呈现模板、会话
导入数据集
app.secret\u key=app.config['secret\u key']
@应用程序路径(“/”)
@应用程序路径(“/index”)
def index():
//索引()的内容
@app.route(“/info/”)
def信息(批次id):
//资讯内容(
@应用程序路径(“/test”)
def test():
返回datasets.main()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(主机=0.0.0.0',端口=8000',调试=True)
我开始写答案,但这里的猜测太多了。当前的问题是导入数据集。不管是否为Flask,该导入都会在导入时执行该模块的所有代码。你需要看看如果
只在函数上加一个阻尼器,阻止它在导入时运行?这似乎奏效了!谢谢。实际上,这似乎是一些Python文件的解决方案,而不是其他文件。我已经更新了上面的帖子。如果uuu name uuu=='\uuuu main uuu'
正确,我是否实现了?谢谢@roganjosh的帮助