Запуск скрипта Python из Webpy - PullRequest
3 голосов
/ 01 марта 2010

Я устанавливаю сервер lighttpd вместе с webpy и fastcgi.Я пытаюсь просто запустить скрипт Python каждый раз, когда к приложению wenpy обращаются.Хотя кажется, что даже когда я даю обычный код Python для выполнения скрипта, он ничего не делает.Поэтому я хотел бы иметь возможность запустить этот скрипт, любая идея будет полезна.

#!/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()

Ответы [ 4 ]

3 голосов
/ 01 марта 2010

Предполагая, что ваш метод запускается, меня больше всего беспокоит то, что произошла ошибка, и вы не получаете стандартный вывод, объясняющий проблему (os.system получит возвращаемое значение, например код выхода). Документы Python рекомендуют заменить его на подпроцесс, мне нравится делать это:

from subprocess import Popen, PIPE
proc = Popen('ls', shell=True, stdout=PIPE)
proc.wait()
proc.communicate()
0 голосов
/ 10 сентября 2013

То, что вы ищете, чтобы увидеть, к чему привела ваша операция:

print proc.stdout.read()

После вашей Popen команды

0 голосов
/ 10 февраля 2011

Возможно, причина в том, что он не работает, в том, что lighttpd является демоном, и демоны закрывают свои файловые дескрипторы stdin / stdout / stderr. Программа, которую вы запускаете, нуждается в терминале с открытыми дескрипторами, но они унаследованы от вызывающей стороны и, следовательно, закрыты. Таким образом, при вызове внешней программы вы должны предоставить их самостоятельно. Например:

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

См. Объяснения и примеры в Документы Python

0 голосов
/ 02 марта 2010

В конце концов я обнаружил, что вызов сценария как объекта приложения webpy прекрасно работает, но его внешнее выполнение просто решает, что никогда не будет работать.

...