проблема импорта с сервером twisted.web

1

Я только начинаю с 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, либо перезагрузить модуль:" (из здесь).

Кто-нибудь знает правильный способ сделать это?

Теги:
twisted
twisted.web

1 ответ

5
Лучший ответ

Короткий ответ: вам нужно установить 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.

  • 1
    Это отличный ответ для простой проблемы. Полагаю, все это время я не очень-то блаженно не знал о PYTHONPATH .
  • 0
    Вместо того, чтобы изменять переменные среды, у меня есть файл .tac, настроенный для добавления каталогов приложений в sys.path перед созданием экземпляра приложения. Таким способом удобнее создавать тестовые копии без локальной настройки.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню