【发布时间】:2011-03-24 18:57:00
【问题描述】:
我在一个预先存在的 pylons 项目(okfn 的 ckan)上使用 python 编程,但我是个 lisper,习惯于这种做事方式。
如有不实之处请指正:
在塔架上,我似乎应该说
$ paster serve --reload
获得一个会注意到变化的网络服务器。
此时我可以更改一个函数,保存文件,然后转到我的浏览器来测试更改。
如果我想在制作网页的过程中检查函数中的变量,那么我输入raise“hello”,然后当我加载页面时,我会得到一个基于浏览器的调试器,我可以在其中检查程序.
这一切都非常好,运行流畅,我的印象是人们倾向于这样编写 pylons 代码。
不幸的是,重新加载需要几秒钟,它一直在打破我的思路。
我想做的是从 emacs 运行 web 服务器(尽管命令行上的 python REPL 几乎一样好),这样我就可以在编辑器中更改一个函数,然后发送新的代码到正在运行的进程,而无需重新启动它。 (使用命令行 repl 我想我必须复制并粘贴新的东西,但这也是可行的,只是不太方便)
Python 看起来非常动态,并且在很多方面很像 lisp,所以原则上我看不出有任何原因导致它不起作用。
所以我想问题是:
有谁熟悉 lisp 的做事方式和 Pylons,他们能告诉我如何在 pylons 中编写 lisp 方式吗?或者出于某种原因,这是不可能的还是一个坏主意?
编辑:
我可以在 emacs 中从我的 python 解释器运行网络服务器:
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 重新定义一个函数,则更改不会反映在网络服务器中。有谁知道为什么?
【问题讨论】:
-
"更改没有反映在网络服务器中。有人知道为什么吗?"问题是对象已经用旧代码创建了。更改类定义不会重新定义现有对象上的
__class__(或func_code或其他)属性。这就是为什么重新加载整个过程通常更容易。 -
谢谢。这看起来像一个表演者。我会放弃的。哦,好吧......我想我会等到我的电脑变得更快......
标签: python pylons read-eval-print-loop