Я только начинаю с twisted.web, и мне не удается импортировать модуль Python в .rpy
script.
in 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 script, я не получу ошибку импорта. Документация по этому вопросу немного расплывчата, она просто говорит: "Однако часто бывает лучше определить подклассы Resource в модулях Python. Чтобы изменения в модулях были видимыми, вы должны либо перезапустить процесс Python, либо перезагрузить модуль:" (из здесь).
Кто-нибудь знает правильный способ сделать это?
Короткий ответ: вам нужно установить PYTHONPATH для включения C:\py\twisted
.
Длинный ответ...
rpy script - это в основном только некоторый код Python, как и любой другой код Python. Таким образом, импорт в rpy script работает так же, как и импорт в любом другом коде 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 script напрямую, или если вы запускаете python и пытаетесь импортировать модуль в интерактивном режиме, но сбой при использовании twistd. Добавление C:\py\twisted
в переменную среды PYTHONPATH
должно сделать модуль доступным, если rpy script запущен с сервера, с которого вы начинаете с twistd.
PYTHONPATH
.