2012-08-01 3 views
2

Je comprends que cette question a déjà été posée mais les méthodes conseillées ne fonctionnent pas pour moi. C'est ce que je veux faire de mon point de vue Django:Exécution du fichier Python à partir de vues Django

sudo python mypythonscript.py arg1 arg2 > mypythonscript.log 

Si j'exécute cette ligne de commande, il fonctionne comme un charme, mais ne peut le faire fonctionner à travers des vues django. J'ai essayé d'utiliser os.system (commande) et subprocess.call (commande, shell = True) mais ils ne fonctionnent pas. Merci d'avance.

EDIT: Ceci est mon views.py:

from django.http import HttpResponse 
import datetime 
import subprocess 

def li_view(request): 
if request.is_ajax(): 
     if request.method == 'GET': 
      message = "This is an XHR GET request" 
     elif request.method == 'POST': 
      message = "This is an XHR POST request" 
      print request.POST 
    else: 
     message = "No XHR" 
    num_instances = request.POST['num_instances'] 
    ami_id = "ami-ff02058b" 
    command = "sudo python /home/bitnami/launch_instances.py 1 " + num_instances + " " + ami_id + " > /home/bitnami/launcinstances.log" 
    subprocess.call(commad, shell=True) 
    return HttpResponse("something creative will go here later") 

L'histoire est que j'ai un formulaire sur mon site et je veux transmettre le contenu de cette forme que arguements à mon launch_instances.py scénario. Lorsque j'appuie sur le bouton "Soumettre" dans mon formulaire, il publie dans/luanch_instances/qui "redirige" vers cette vue. L'exécution du code tel qu'il est ne fera rien, il me suffira de me montrer "quelque chose qui va aller plus tard" sur une nouvelle page. Si je devais jamais comment utiliser

suprocess.check_call(command, shell=True) 

C'est ce que je reçois:

Command 'sudo python /home/bitnami/launch_instances.py 1 ami-ff02058b > /home/bitnami/launchinstances.log' returned non-zero exit status 2 
+3

Vous devez nous dire pourquoi cela n'a pas fonctionné. Montrez votre code et sortie. –

+2

Aussi qu'est-ce que vous essayez d'accomplir en faisant cela dans une vue Python? Il est généralement conseillé d'utiliser une file d'attente de tâches telle que Celery pour effectuer ce genre de tâches, car elle ne lie pas votre serveur Web. –

+0

@VladimirVolodin J'ai ajouté la sortie et le code maintenant – AmirHBP

Répondre

2

Comme vous essayez d'exécuter un script python, vous pouvez simplement importer du code de launch_instances.py dans votre vue , redirige la sortie vers /home/bitnami/launcinstances.log (à propos de la redirection de stdout vers un fichier en python: Redirect stdout to a file in Python?). Mais il y a toujours un problème avec les privilèges root - une option est de changer les permissions de: ressources nécessaires pour appeler le code depuis launch_instances.py; votre fichier journal Pour permettre à votre processus django d'exécuter cette opération, la deuxième option (non recommandée) consiste à exécuter l'application django en tant que root.

+0

Je ne sais pas pourquoi l'exécution: sudo python mypythonscript.py arg1 arg2> mypythonscript.log a besoin d'autorisations root. Supposons que mypythonscript.py n'est pas la propriété du propriétaire du processus django, alors vous pouvez simplement faire chmod a + rx mypythonscript.pl – Marek

+0

merci beaucoup mate – AmirHBP

+0

Mais rappelez-vous que faire chmod a + rx peut casser la sécurité. – Marek

3

Très probablement, cela a quelque chose à voir avec les permissions. Essayez d'examiner stderr et stdout de l'exécution de votre commande. J'utilise ce code pour déboguer mes commandes shell:

process = subprocess.Popen(shlex.split(command), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
     output,error = process.communicate(input=pipe) 
+0

en supposant que par input = pipe vous vouliez dire input = subprocess.PIPE, j'ai l'erreur suivante: l'objet 'int' n'a pas d'attribut '__getitem__' – AmirHBP

Questions connexes