5

私は既存のpylonsプロジェクト(okfnのckan)をPythonでプログラミングしていますが、私は商売をしている人であり、その方法に慣れています。

私が虚偽の陳述をした場合は私を訂正してください:

パイロンでは、私は言うべきだと思われます

$パスターサーブ--reload

変更に気付くWebサーバーを取得します。

その時点で、関数を変更し、ファイルを保存してから、ブラウザーに移動して変更をテストできます。

Webページを作成する過程で関数内の変数を調べたい場合は、raise "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()

したがって、必要なのは、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サーバーに反映されないことを除いて、これは機能しているようです。誰かが理由を知っていますか?

4

1 に答える 1

1

TokenMacGuy のコメントで与えられた理由、つまり、クラスを再定義してもそのクラスのインスタンスのコードが変更されないため、この作業方法は Python では不可能のようです。

他の多くの点で python は非常に柔軟に見えるので、これは非常に残念なことですが、なぜ python-swank がないのかが説明されています!

于 2011-03-25T15:56:26.823 に答える