Вы могли бы написать что-то похожее на перегрузчик Paster, которое будет работать так:
- запустите вашу основную функцию, и перед импортом / использованием какого-либо скрученного кода выполните форк / порождение подпроцесса.
- В подпроцессе запустите ваше скрученное приложение.
- В основном процессе запустите ваш код, который проверяет наличие измененных файлов. Если код изменился, перезагрузите подпроцесс.
Однако проблема здесь в том, что в отличие от веб-сервера разработки, большинство скрученных приложений имеют гораздо больше состояний, и простое уничтожение / перезапуск процесса - плохая идея, вы можете потерять некоторое состояние.
Есть способ сделать это чисто:
Когда вы создаете скрученное приложение, используйте subprocess.Popen()
или аналогичный, чтобы получить трубы stdin / stdout. Теперь в вашем подпроцессе используйте витой реактор для прослушивания stdin (для этого есть код в витой, см. twisted.internet.stdio
, который позволяет вам иметь протокол, который взаимодействует с транспортом stdio обычным витым неблокирующим образом)
Наконец, когда вы решите, что пришло время перезагрузить, напишите что-нибудь в stdin подпроцесса и попросите его завершить работу. Теперь ваш искаженный код может ответить и корректно завершить работу. Как только он завершится, ваш мастер-процесс может просто вызвать его снова.
(В качестве альтернативы вы можете использовать сигналы для достижения этой цели, но это может быть не переносимость ОС)