Pylons REPL пересчитывает код на работающем веб-сервере - PullRequest
5 голосов
/ 24 марта 2011

Я программирую на python для уже существующего проекта по пилонам (ckan от okfn), но я шучу по профессии и привык к такому способу.

Пожалуйста, поправьте меня, если ясделать ложные заявления:

В пилонах кажется, что я должен сказать

$ paster serve --reload

, чтобы получить веб-сервер, который будет замечать изменения.

На этом этапе я могу изменить функцию, сохранить файл и затем перейти в свой браузер, чтобы проверить это изменение.

Если я хочу проверить переменные в функции в процессе созданиявеб-страницы, затем я поднимаю «привет», а затем, когда я загружаю страницу, я получаю отладчик на основе браузера, в котором я могу исследовать программу.

Это все очень хорошо и работает плавно, и у меня складывается впечатление, что именно так люди, как правило, пишут код пилонов.

К сожалению, перезагрузка занимает несколько секунд, и она продолжает ломать мою чередуподумал.

Что я хотел бы сделать, так это запустить веб-сервер из emacs (хотя REPL для Python в командной строке был бы почти таким же хорошим), чтобы я мог изменить функцию в редактореи затем отправьте новый код запущенному процессу без необходимости его перезапуска.(с командной строкой repl, я думаю, мне пришлось бы скопировать и вставить новую вещь, но это также было бы работоспособно, чуть менее удобно)

Python кажется очень динамичным и во многом похожим на lispпоэтому я не вижу принципиальной причины, по которой это не сработает.

Так что, я думаю, вопрос в следующем:

Кто-нибудь знает, как делать что-то с помощью LISP, и сПилоны, и могут ли они сказать мне, как запрограммировать способ lisp в пилонах?Или это невозможно или плохая идея по какой-то причине?

Редактировать:

Я могу запустить веб-сервер из моего интерпретатора Python внутри Emacs с помощью:

from paste.script.serve import ServeCommand
ServeCommand("serve").run(["development.ini"])

И яможно заставить код остановиться и показать мне, что он делает, вставив:

import pdb
pdb.set_trace()

, так что теперь все, что мне нужно, это способ заставить веб-сервер работать в другом потоке, чтобы управление возвращалось в REPLи я могу переопределить функции и переменные в запущенном процессе.

def start_server():
    from paste.script.serve import ServeCommand
    ServeCommand("serve").run(["development.ini"])


server_thread=threading.Thread(target=start_server)
server_thread.start()

Кажется, это работает, за исключением того, что если я переопределю функцию в REPL, изменение не будет отражено в веб-сервере.Кто-нибудь знает почему?

1 Ответ

1 голос
/ 25 марта 2011

Кажется, что этот способ работы невозможен в python по причине, указанной в комментарии TokenMacGuy, т.е. потому, что переопределение класса не меняет код в экземпляре этого класса.позор, поскольку во многих других отношениях python кажется очень гибким, но он объясняет, почему нет python-swank!

...