2010-02-28 4 views
3

Je configure un serveur lighttpd avec webpy et fastcgi. J'essaye de courir simplement un manuscrit de python chaque fois que l'application wenpy est accédée. Bien qu'il semble même que je donne le code python normal pour exécuter le script, il ne fait rien. Donc, je voudrais être en mesure d'exécuter ce script, toute idée serait utile.Exécution d'un script python à partir de webpy

#!/usr/bin/env python 

import web, os 

urls = (
    '/(.*)', 'hello' 
) 
app = web.application(urls, globals()) 

class hello: 
    def GET(self, name): 
     os.system("python /srv/http/script/script.py") 
     if not name: 
      name = 'world' 
     return "Running" 

web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr) 
if __name__ == "__main__": 
    app.run() 

Répondre

3

En supposant que votre méthode fonctionne ma principale préoccupation serait qu'une erreur se produit et vous ne recevez pas la sortie standard expliquant le problème (os.system va obtenir la valeur de retour, par exemple le code de sortie). docs Python recommande de le remplacer subprocess, j'aime faire:

from subprocess import Popen, PIPE 
proc = Popen('ls', shell=True, stdout=PIPE) 
proc.wait() 
proc.communicate() 
+0

Tout ce que je reçois de pipe est un -1, et le programme n'est jamais exécuté. – Recursion

+0

Avez-vous essayé d'imprimer la commande et de l'exécuter directement? Qu'en est-il à travers une coquille? -1 Implique une défaillance à un certain niveau. – Aea

+0

Fonctionne très bien dans un shell quand je l'exécute normalement. Le script im essayant de fonctionner aussi bien que le programme ci-dessus fonctionne bien. Je reçois juste l'erreur quand j'essaye de l'exécuter en accédant au serveur. – Recursion

0

Je trouve finalement que d'appeler le script comme un objet de l'application webpy fonctionne très bien, mais l'exécution décide à l'extérieur tout simplement jamais travailler.

0

Probablement, la raison pour laquelle cela ne fonctionne pas est que lighttpd est un démon, et les démons ferment leurs descripteurs de fichiers stdin/stdout/stderr. Le programme que vous exécutez a besoin d'un terminal avec ces descripteurs ouverts, mais ils sont hérités de l'appelant et donc fermé. Ainsi, lorsque vous appelez un programme externe, vous devez les fournir vous-même. Par exemple:

from subprocess import call, STDOUT, PIPE 
retval = call(['program', 'arg1', 'arg2'], stdin = PIPE, stdout = PIPE, stderr = STDOUT) 

Voir explications et des exemples dans Python docs

0

Qu'est-ce que vous cherchez à voir ce que votre opération a abouti à: est-

print proc.stdout.read()

Après votre commande Popen

Questions connexes