2015-06-04 4 views
3

Мое приложение было настроено со следующим файлом app.py и двумя файлами .html: index.html (базовый шаблон) и upload.html, где клиент может видеть только что загруженные изображения. Проблема в том, что я хочу, чтобы моя программа (предположительно app.py) выполняла функцию matlab до того, как пользователь перенаправлен на шаблон upload.html. Я нашел Q & А о том, как запустить команды оболочки bash на фляге (но это не команда), но я не нашел ее для скриптов.Запуск сценария оболочки на колбе

Обходным решением, которое я получил, было создание сценария оболочки: hack.sh, который будет запускать код matlab. В моем терминале это прямо вперед:

$bash hack.sh 

hack.sh:

nohup matlab -nodisplay -nosplash -r run_image_alg > text_output.txt & 

run_image_alg мой файл MATLAB (run_image_alg.m)

Вот мой код app.py:

import os 

from flask import Flask, render_template, request, redirect, url_for, send_from_directory 
from werkzeug import secure_filename 

# Initialize the Flask application 

app = Flask(__name__) 

# This will be th path to the upload directory 
app.config['UPLOAD_FOLDER'] = 'uploads/' 

# These are the extension that we are accepting to be uploaded 
app.config['ALLOWED_EXTENSIONS'] = set(['png','jpg','jpeg']) 

# For a given file, return whether it's an allowed type or not 
def allowed_file(filename): 
    return '.' in filename and \ 
    filename.rsplit('.',1)[1] in app.config['ALLOWED_EXTENSIONS'] 

# This route will show a form to perform an AJAX request 
# jQuery is loaded to execute the request and update the 
# value of the operation 

@app.route('/') 
def index(): 
    return render_template('index.html') 

#Route that will process the file upload 
@app.route('/upload',methods=['POST']) 
def upload(): 
    uploaded_files = request.files.getlist("file[]") 
    filenames = [] 
    for file in uploaded_files: 
    if file and 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 
) 

Возможно, у меня может быть библиотека? Я нашел аналогичный Q & A в stackoverflow, где кто-то хотел запустить (известную) команду оболочки ($ ls -l). Мой случай отличается, так как это не известная команда, но созданный сценарий:

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() 

ответ

6

Если вы хотите запустить MATLAB, просто изменить свою команду

cmd = ["matlab", "-nodisplay", "-nosplash", "-r", "run_image_alg"] 

Если вы хотите перенаправить вывод a file:

with open('text_output.txt', 'w') as fout: 
    subprocess.Popen(cmd, stdout=fout, 
          stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
+0

Это сработало. Большое спасибо! – Arturo

Смежные вопросы