python - Running shell script on flask -
my app has been setup following app.py file , 2 .html files: index.html (base template), , upload.html client can see images uploaded. problem have that, want program (presumable app.py) execute matlab function before user redirected upload.html template. i've found q&a's how run bash shell commands on flask (yet not command), haven't found 1 scripts.
a workaround got create shell script: hack.sh run matlab code. in terminal straight forward:
$bash hack.sh
hack.sh:
nohup matlab -nodisplay -nosplash -r run_image_alg > text_output.txt &
run_image_alg matlab file (run_image_alg.m)
here code app.py:
import os flask import flask, render_template, request, redirect, url_for, send_from_directory werkzeug import secure_filename # initialize flask application app = flask(__name__) # th path upload directory app.config['upload_folder'] = 'uploads/' # these extension accepting uploaded app.config['allowed_extensions'] = set(['png','jpg','jpeg']) # given file, return whether it's allowed type or not def allowed_file(filename): return '.' in filename , \ filename.rsplit('.',1)[1] in app.config['allowed_extensions'] # route show form perform ajax request # jquery loaded execute request , update # value of operation @app.route('/') def index(): return render_template('index.html') #route process file upload @app.route('/upload',methods=['post']) def upload(): uploaded_files = request.files.getlist("file[]") filenames = [] file in uploaded_files: if file , allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['upload_folder'],filename)) filenames.append(filename) print uploaded_files #run bash script here. return render_template('upload.html',filenames=filenames) @app.route('/uploads/<filename>') def uploaded_file(filename): return send_from_directory(app.config['upload_folder'],filename) if __name__ == '__main__': app.run( host='0.0.0.0', #port=int("80"), debug=true )
i might presumably missing library? found similar q&a on stackoverflow wanted run (known) shell command ($ls -l). case different since it's not known command, created script:
from flask import flask import subprocess app = flask(__name__) @app.route("/") def hello(): cmd = ["ls","-l"] p = subprocess.popen(cmd, stdout = subprocess.pipe, stderr=subprocess.pipe, stdin=subprocess.pipe) out,err = p.communicate() return out if __name__ == "__main__" : app.run()
if want run matlab, change command to
cmd = ["matlab", "-nodisplay", "-nosplash", "-r", "run_image_alg"]
if want redirect output file:
with open('text_output.txt', 'w') fout: subprocess.popen(cmd, stdout=fout, stderr=subprocess.pipe, stdin=subprocess.pipe)
Comments
Post a Comment