2011-03-24 63 views
5

我在预先存在的pylons项目(okfn的ckan)上对python进行编程,但是我是一个交易者,习惯于这种做事的方式。Pylons REPL重新评估运行Web服务器中的代码

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

在塔似乎我应该说

$贴膜服务--reload

得到那个会发现变化的Web服务器。

在这一点上,我可以改变一个功能,保存文件,然后到我的浏览器来测试更改。

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

这一切都非常好,并且运作顺畅,我的印象是人们倾向于编写链接代码。

不幸的是,重新加载需要几秒钟的时间,它不断打破我的思路。

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

Python看起来很有活力,很像lisp,所以很多方面都如此原则上我看不出任何理由,为什么不行。

所以我想的问题是:

是任何人都熟悉的做事方式口齿不清,并与主塔,他们能告诉我如何在塔柱口齿不清的方式编程?或者出于某种原因,这是不可能的还是一个坏主意?

编辑:

我可以从我的Python解释器运行Web服务器在Emacs:

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

,我可以得到的代码插入停下来,告诉我它在做什么:

import pdb 
pdb.set_trace() 

所以现在我所需要的是一种让Web服务器在不同线程上运行的方式,以便控制权返回到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服务器。有谁知道为什么?

+0

”这个变化没有反映在网络服务器上,有人知道为什么吗?“问题是已经用旧代码创建了这些对象。改变类的定义不会重载现有对象上的'__class__'(或'func_code'或其他)属性。这就是为什么重新加载整个过程通常更容易。 – SingleNegationElimination 2011-03-25 02:25:23

+0

谢谢。这看起来像一个showstopper。我会放弃。哦,好吧...我想我会等到我的电脑变得更快... – 2011-03-25 15:57:59

回答

1

似乎这种工作方式在python中是不可能的,因为TokenMacGuy的评论给出了这个原因,也就是说重新定义一个类不会改变该类的一个实例中的代码。

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