title: Running shell script on flask
body: <p>My app has been setup with the following app.py file and two .html files: index.html (base template), and upload.html where the client can see the images that he just uploaded. The problem I have is that, I want my program (presumable app.py) to execute a matlab function before the user is redirected to the upload.html template. I've found Q&amp;A's about how to run bash shell commands on flask (yet this is not a command), but I haven't found one for scripts. </p>
  
  <p>A workaround that I got was to create a shell script: hack.sh that will run the matlab code. In my terminal this is straight forward:</p>
  
  <pre><code>$bash hack.sh
  </code></pre>
  
  <p>hack.sh:</p>
  
  <pre><code>nohup matlab -nodisplay -nosplash -r run_image_alg &gt; text_output.txt &amp;
  </code></pre>
  
  <p>run_image_alg is my matlab file (run_image_alg.m)</p>
  
  <p>Here is my code for app.py:</p>
  
  <pre><code>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/&lt;filename&gt;')
  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
    )
  </code></pre>
  
  <p>I might presumably be missing a library? I found a similar Q&amp;A on stackoverflow where someone wanted to run a (known) shell command  ($ls -l). My case is different since it's not a known command, but a created script:</p>
  
  <pre><code>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()
  </code></pre>