我刚开始使用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)。
有谁知道这样做的正确方法?
答案 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脚本,则应该可以导入模块。