16๐
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 url
from . import views
urlpatterns = [
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 subprocess
def 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/sh
echo 'hello'
File permision ls ~
-rwxrw-r-- 1 test test 10 Jul 4 19:54 hello.sh*
2๐
You can use python module subprocess in your view.
import subprocess
def your_view(request):
subprocess.call('your_script.sh')
- Django : HTML form action directing to view (or url?) with 2 arguments
- Make group by having count(*) with django orm
- Add dynamic field to django admin model form
2๐
You can refer my blog for detailed explanation >>
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, STDOUT
from django.http import HttpResponse
def 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
- Exposing django admin to users. Harmful?
- Django confirm password validator
- Django CMS โ check if placeholder is empty
1๐
Do it with Python:
With Subprocess:
import subprocess
proc = subprocess.Popen("ls -l", stdout=subprocess.PIPE)
output, err = proc.communicate()
print output
Or with os
module:
import os
os.system('ls -l')
0๐
From Python 3.5 onwards, subprocess.run()
is the recommended approach
As per the doc;
The recommended approach to invoking subprocesses is to use the run()
function for all use cases it can handle. For more advanced use cases,
the underlying Popen interface can be used directly.The run() function was added in Python 3.5; if you need to retain
compatibility with older versions, see the Older high-level API
section.
As in this example,
import subprocess
def index(request):
if request.POST:
subprocess.run(['/home/josema/parser.sh'])
return render(request,'nuevaCancion.html',{})
- Installing PyGObject via pip in virtualenv
- Implementing HATEOAS in Django REST framework
- Django forms: default values for bound forms
- Meta.fields contains a field that isn't defined on this FilterSet: ****
- How to build a REST client frontend for a REST API backend?