2010-05-14 61 views
1

我剛開始接觸twisted.web,和我有麻煩導入Python模塊爲.rpy腳本。與twisted.web服務器導入問題

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)。

有誰知道正確的方式做到這一點?

回答

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腳本時。

+1

這是一個簡單的問題一個很好的答案。我想這整個時間我都不太會意識到「PYTHONPATH」。 – 2010-05-15 07:25:42

+0

而不是更改環境變量,我有我的.tac文件設置爲在創建應用程序實例之前將應用程序目錄添加到sys.path。以這種方式設置沒有本地配置的測試副本會更方便。 – olsner 2011-02-08 16:43:53

+1

但您的來源**的位置是**本地配置! – 2011-02-09 00:44:14