繁体   English   中英

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

[英]Load/reload a portion of code in Python without restarting main script

介绍

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

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

最后的笔记

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM