Pylons REPL在运行Web服务器时重新评估代码

时间:2011-03-24 18:57:00

标签: python pylons read-eval-print-loop

我正在使用预先存在的pylons项目(okfn的ckan)在python中编程,但我是一个贸易上的lisper并习惯了这种做事方式。

如果我做出虚假陈述,请纠正我:

在挂架中似乎我应该说

$ paster serve --reload

获取会注意到更改的Web服务器。

此时我可以更改功能,保存文件,然后转到浏览器测试更改。

如果我想在制作网页的过程中检查函数中的变量,那么我把加号“hello”,然后当我加载页面时,我得到一个基于浏览器的调试器,我可以在其中检查程序。

这一切都非常好并且可以游泳,我得到的印象是人们倾向于编写挂架代码。

不幸的是,重新加载需要几秒钟,而且它一直在打破我的思路。

我想做的是从emacs运行web服务器,(虽然命令行上的python REPL几乎一样好),这样我就可以在编辑器中更改一个函数然后发送新的代码到正在运行的进程而不必重新启动它。 (使用命令行repl我想我必须复制并粘贴新的东西,但这也是可行的,只是稍微不方便)

Python似乎非常有活力,而且在很多方面与lisp非常相似,所以我原则上看不出为什么这样做不起作用的原因。

所以我猜问题是:

是否有人熟悉lisp的做事方式,以及Pylons,他们能告诉我如何在pylons中编写lisp方式吗?或者出于某种原因它是不可能的还是坏的?

编辑:

我可以使用以下内容从emacs内部的python解释器运行web服务器:

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重新定义一个函数,更改不会反映在Web服务器中。有谁知道为什么?

1 个答案:

答案 0 :(得分:1)

似乎这种工作方式在python中是不可能的,原因是TokenMacGuy的注释,即因为重新定义类不会改变该类实例中的代码。

这似乎是一种可怕的耻辱,因为在许多其他方面,python似乎非常灵活,但它确实解释了为什么没有python-swank!