在不重新启动主脚本的情况下加载/重新加载Python中的一部分代码

fro*_*der 5 python irc twisted

介绍

过去几天我一直在修补Twisted,不到一个月前就已经拿起了python.我的第一个倾向是玩我知道并每天使用的东西,IRC.由于ircLogBot.py示例,我已经启动并运行了基本的IRC连接.

我希望在收到IRC事件(PRIVMSG/CTCP/JOIN/PART)时运行一些任意代码,为了调试,我希望能够对这段代码进行更改,然后重新加载关闭整个脚本并重新连接到IRC服务器.

最后的笔记

它不一定是包含Twisted的解决方案,因为我还没有完全理解它.虽然我认为这是一种扭曲的事情,作为一个事件驱动的框架,可能会做得很好.

Gly*_*yph 9

Twisted具有一些内置功能twisted.python.rebuild,可以更全面地实现Python的内置reload功能.仍然存在一些局限性,但它与Python内置重载的主要区别在于它会找到旧对象的实例并用新版本替换它们的类.(主要限制是您必须知道您的实例可能具有与您当前版本不匹配的旧状态__init__,如果您已更改它,那就是rebuild.Sensitive.)

如果您想创建一些非常华丽和自动的东西,您可以设置一个文件系统监视器来检测文件何时更改,并在更改时重新加载关联的模块.在Linux上,您可以使用Twisted inotify对更改通知的支持,在OS X上,您可以通过PyObjCcfreactorFSEventsAPI 一起使用.(我不知道哪个文件更改监控方案在win32上工作,但也可能在那里工作.)


Ray*_*ger 3

安排一个重复事件(每隔几秒)来重新加载正在调试的模块。为此,请使用内置的reload()函数。

您可能希望将其包装在 try/ except 中,以处理在正在调试的模块中引入错误的情况。这将使服务器在出现错误时保持活动状态:-)