从webpy运行Python脚本

4 投票
5 回答
2706 浏览
提问于 2025-04-15 19:50

我搭建了一个lighttpd服务器,并且使用了webpy和fastcgi。我想要每次访问webpy应用的时候都能运行一个python脚本。不过,即使我给了正常的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()

5 个回答

0

可能它不工作的原因是,lighttpd 是一个守护进程,而守护进程会关闭它们的标准输入、标准输出和标准错误的文件描述符。你运行的程序需要一个打开这些描述符的终端,但这些描述符是从调用者那里继承过来的,所以它们是关闭的。因此,当你调用一个外部程序时,你需要自己提供这些描述符。例如:

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

可以在 Python 文档 中查看解释和示例

0

我最后发现,把这个脚本当作webpy应用的一个对象来调用效果很好,但如果从外部执行它,就总是无法正常工作。

3

假设你的方法可以运行,我最担心的是可能出现了错误,但你没有看到标准输出的信息来解释这个问题(os.system会返回一个值,比如退出代码)。Python的文档建议用subprocess来替代os.system,我通常会这样做:

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

撰写回答