使用twisted.web服务器导入问题

时间:2010-05-14 22:54:23

标签: python twisted twisted.web

我刚开始使用twisted.web,我在将Python模块导入.rpy脚本时遇到了问题。

C:\py\twisted\mysite.py中,我有这个:

from twisted.web.resource import Resource
from twisted.web import server

class MySite(Resource):
    def render_GET(self, request):
        request.write("<!DOCTYPE html>")
        request.write("<html><head>")
        request.write("<title>Twisted Driven Site</title>")
        request.write("</head><body>")
        request.write("<h1>Twisted Driven Website</h1>")
        request.write("<p>Prepath: <pre>{0}</pre></p>".format(request.prepath))
        request.write("</body></html>")
        request.finish()
        return server.NOT_DONE_YET

C:\py\twisted\index.rpy,我有:

import mysite
reload(mysite)

resource = mysite.MySite()

我在命令提示符下运行twistd -n web --port 8888 --path C:\py\twisted,服务器已成功启动。但是当我请求localhost:8888时,我得到了一个源自ImportError的(巨大的)堆栈跟踪:

<type 'exceptions.ImportError'>: No module named mysite

我可以从解释器导入模块,如果我只是执行index.rpy作为python脚本,我不会得到导入错误。关于这个主题的文档有点模糊,它只是说“但是,在Python模块中定义Resource子类通常是一个更好的主意。为了使模块中的更改可见,您必须重新启动Python进程,或重新加载模块:“(来自here)。

有谁知道这样做的正确方法?

1 个答案:

答案 0 :(得分:5)

简短回答:您需要设置PYTHONPATH以包含C:\py\twisted

答案很长......

rpy脚本基本上只是一些Python代码,就像任何其他Python代码一样。因此,rpy脚本中的导入就像在任何其他Python代码中导入一样。对于最常见的情况,这意味着按顺序逐个访问sys.path中的目录,如果找到与导入的名称匹配的.py文件,则该文件用于定义模块

sys.path主要来自静态定义,包括C:\ Python26 \ Lib \和PYTHONPATH环境变量。但是,还有一件值得了解的事情。运行“python”时,当前工作目录将添加到sys.path的前面。运行“python C:\ foo \ bar \ baz.py”时,C:\foo\bar\' is added to the front of sys.path . But when you run "twistd ...", nothing useful is added to sys.path`。

这最后一个行为可能解释了为什么你的测试可以直接运行rpy脚本,或者运行python并尝试以交互方式导入模块,但在使用twistd时失败。将C:\py\twisted添加到PYTHONPATH环境变量时,如果从以twistd开头的服务器运行rpy脚本,则应该可以导入模块。