从webpy运行Python脚本
我搭建了一个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()