シナリオ: 動作中に .py モジュールをオンザフライでロードするモジュラー アプリ。プログラマー (私) は、モジュールのコードを編集し、実行を停止せずにプログラムに再ロードしたいと考えています。
これはできますか?
更新されたmodule.pyでインポートを2回実行しようとしましたが、変更が反映されません
モジュールをreload
リロードしますが、他の回答が言及しているように、スムーズに機能させるにはかなりの予防措置が必要です-そして、簡単に機能すると思われるものについては、作業量の点でかなりのショックを受けます実際に必要です。
フォームを使用したことがある場合from module import afunction
は、ほぼ確実に機能しません。何か役立つことを期待したい場合は、モジュールを排他的にインポートreload
する必要があり、モジュール内から関数やクラスなどをインポートする必要はありません (そうでない場合)。モジュールからあちこちにインポートされたすべてのビットとピースをどうにかして追跡し、それらのすべてを再バインドする必要があります-eep;-)。とにかく、リロードを行うかどうかに関係なく、このルールに従うことを好みますが、リロードを使用する場合、それは重要です.reload
難しい問題は、モジュールの以前のバージョンに存在していたクラスのインスタンスがどこにでもある場合、reload
それ自体はそれらのインスタンスをアップグレードするためにまったく何もしないということです。 その問題は本当に難しいものです。Python クックブック (第 2 版) で最も長くて難しいレシピの 1 つは、「既存のインスタンスを実際にアップグレードするリロード」をサポートするようにモジュールをコーディングする方法に関するものです。もちろん、これは OOP スタイルでプログラミングする場合にのみ問題になりますが、「このプラグインをリロードする」機能が必要なほど複雑な Python プログラムには、多くの OOP が含まれている可能性が非常に高いため、小さな問題ではありません。
リロードのドキュメントはかなり完全で、この問題について言及していますが、解決方法のヒントはありません。 オンラインの Python Cookbook にある Michael Hudson によるこのレシピの方が優れていますが、印刷物 (第 2 版) に進化したものの始まりにすぎません。レシピ 20.15 のオンライン バージョンはこちらです( O'Reilly の商用オンライン ブック サービスの期間限定の無料プレビュー)。
livecodingモジュールを使用することもできます。
アレックスの答えと他の人は一般的なケースをカバーしています。
ただし、作業しているこれらのモジュールは独自のものであり、それらのみを編集するため、組み込みのリロードに依存するのではなく、ある種のローカル リロード メカニズムを実装することができます。ファイルをロードし、コンパイルして特定の名前空間に評価し、呼び出し元のコードに準備ができていることを伝えるものとして、モジュール ローダーを設計できます。init
モジュールを適切に再初期化する適切な機能があることを確認することで、リロードを処理できます。これらだけを編集することになると思います。
少し手間がかかりますが、興味深く、時間をかける価値があるかもしれません。
reload()は、必要なことを行います。再コンパイル時にモジュールで実行されるコードに注意する必要があります。モジュールに定義のみが含まれている場合は、通常最も簡単です。