2011-10-27 1 views
5

イントロ

私は、過去数日間ツイストいじりてきたが、ヶ月前よりも少ないのpythonを拾ったメインスクリプトを再起動せずにPythonでコードの一部をリロードします。私の最初の志向は、毎日知っている何か、IRCを使って遊ぶことでした。私はircLogBot.pyの例のおかげで、基本的なIRC接続を起動して実行しています。ロード/

質問

私は走るいくつかの任意のコードを持つようにしたい時はいつでもIRCイベント(PRIVMSG/CTCP// PART、JOIN)を受信すると、デバッグの目的のために、私はに変更を加えることができるようにしたいのですがスクリプト全体をシャットダウンしてIRCサーバーに再接続せずにリロードしてください。

決勝ノート

私は完全にそれをまだ理解していないように、それは、ツイストを組み込んだソリューションである必要はありません。イベントドリブンフレームワークなので、これがうまくいくように設計されていると思います。

答えて

3

デバッグ対象のモジュールをリロードする定期的なイベント(数秒ごと)をスケジュールします。このためには、組み込みのreload()関数を使用します。

デバッグ中のモジュールにエラーが発生した場合に対処するために、try/exceptでラップしたい場合があります。それはエラーに直面してサーバーを生き残らせるでしょう:-)

+0

受け入れられる!私はそのようなモジュールを使うとは思わなかった。 – frontendloader

+0

[reloadのドキュメント](http://docs.python。org/library/functions.html#reload)、それはあまり直感的ではありません。 –

2

コードのリロードを処理する 'livecoding'を見てみるとよいでしょう。それはあなたのニーズに合うかもしれません。ただし、 'livecoding'には必ずしもpythonicではない独自の規則に従うためのコードファイル(フォルダ)が必要です。

もう一つの可能​​性は、レイモンド氏が提案したようにreloadを使って自分のシステムをロールすることです。コードが状態データから十分に切り離されていれば、実装が簡単です。

0

対話型インタープリタで実行します。バックグラウンドスレッドを開始することはできますが、それでも対話モードになっています。その後、必要に応じてリロードすることができます。これは、タイマーで自動化するよりも、より多くの制御を可能にします。

私はときどき私のエンタープライズサーバーを対話モードで起動することがありました。

9

Twistedには、twisted.python.rebuildに組み込まれている機能がいくつか組み込まれており、Pythonの組み込みのreload機能がより包括的に実装されています。いくつかの制限がありますが、Pythonの組み込みリロードとの主な違いは、オブジェクトの古いインスタンスを見つけてそのクラスを新しいバージョンに置き換えることです。 (主な制限は、インスタンスが現在のバージョンの__init__と一致しない古い状態を持っている可能性があります(変更した場合はrebuild.Sensitiveとなります)。

If本当に魅力的で自動的なものにしたい場合は、ファイルがいつ変更されたかを検出するファイルシステムモニタを設定し、変更されたときに関連モジュールを再構築して再ロードします。 Linuxでは、変更通知にTwistedのinotifyサポートを使用できます。また、OS Xでは、cfreactorFSEvents API via PyObjCを使用できます。 (私は、ファイル変更モニタリング方式がwin32で動作するのかどうかはわかりませんが、そこにも可能性があります)