Run bash script with Django Run bash script with Django shell shell

Run bash script with Django


You can do this with empty form.

In your template make a empty form

# index.html<form action="{% url 'run_sh' %}" method="POST">    {% csrf_token %}    <button type="submit">Call</button></form>

Add url for your form

from django.conf.urls import urlfrom . import viewsurlpatterns = [    url(r'^run-sh/$', views.index, name='run_sh')]

Now in your views.py you need to call the bash.sh script from the view that returns your template

import subprocessdef index(request):    if request.POST:        # give the absolute path to your `text4midiAllMilisecs.py`        # and for `tiger.mid`        # subprocess.call(['python', '/path/to/text4midiALLMilisecs.py', '/path/to/tiger.mid'])        subprocess.call('/home/user/test.sh')    return render(request,'index.html',{})

My test.sh is in the home directory. Be sure that the first line of bash.sh have sh executable and also have right permission. You can give the permissions like this chmod u+rx bash.sh.

My test.sh example

#!/bin/shecho 'hello'

File permision ls ~

-rwxrw-r--   1 test test    10 Jul  4 19:54  hello.sh*


You can refer my blog for detailed explanation >>

http://www.easyaslinux.com/tutorials/devops/how-to-run-execute-any-script-python-perl-ruby-bash-etc-from-django-views/

I would suggest you to use Popen method of Subprocess module. Your shell script can be executed as system command with Subprocess.

Here is a little help.

Your views.py should look like this.

from subprocess import Popen, PIPE, STDOUTfrom django.http import HttpResponsedef main_function(request):    if request.method == 'POST':            command = ["bash","your_script_path.sh"]            try:                    process = Popen(command, stdout=PIPE, stderr=STDOUT)                    output = process.stdout.read()                    exitstatus = process.poll()                    if (exitstatus==0):                            result = {"status": "Success", "output":str(output)}                    else:                            result = {"status": "Failed", "output":str(output)}            except Exception as e:                    result =  {"status": "failed", "output":str(e)}            html = "<html><body>Script status: %s \n Output: %s</body></html>" %(result['status'],result['output'])            return HttpResponse(html)

In this example, stderr and stdout of the script is saved in variable 'output', And exit code of the script is saved in variable 'exitstatus'.

Configure your urls.py to call the view function "main_function".

url(r'^the_url_to_run_the_script$', main_function)

Now you can run the script by calling http://server_url/the_url_to_run_the_script


Do it with Python:

With Subprocess:

import subprocessproc = subprocess.Popen("ls -l", stdout=subprocess.PIPE)output, err = proc.communicate()print output

Or with os module:

import osos.system('ls -l')