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

时间:2011-10-27 06:06:19

标签: python twisted irc

简介

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

问题

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

最终笔记

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

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

您可能需要查看处理代码重新加载的“livecoding”;它可能适合您的需求。但是请注意,“livecoding”需要代码文件(文件夹)遵循其自身不一定是pythonic的约定。

另一种可能性是使用reload推出自己的系统,就像Raymond建议的那样。如果您的代码与状态数据完全分离,则可能很容易实现。

答案 3 :(得分:0)

在交互式解释器中运行。您可以启动后台线程,但仍处于交互模式。然后你可以根据需要重新加载。这比你在计时器上自动控制更有效。

我曾经偶尔以交互模式启动整个企业服务器。