2011-03-24 47 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! 「