有没有办法在Python中重新加载“当前”文件?

时间:2012-02-20 14:18:45

标签: python

我正在研究一个小型的IRC机器人,做一些简单的事情,我觉得很烦人,每次我想测试任何变化,我必须找到进程,杀死它,再次启动机器人并等待它连接。我尝试为它重新加载Python文件的命令,以便保存任何更改,我可以更容易地编辑它,但是当使用此代码尝试重新加载时:

def reload(self, *args):
    reload(pybot)
    return "Reloaded!"

我收到此错误:

TypeError: reload() argument must be module

这个机器人使用的唯一文件是它自己的pybot.pyiblib module和其他一些python库。

我的问题是,有没有办法让Python重新加载当前使用的文件,而不是模块?

3 个答案:

答案 0 :(得分:3)

根据错误,“pybot”不是指模块。如果您要重新加载的模块的名称实际上是“pybot”,那么在您成功执行“import pybot”之前的某个时刻,您的代码将会起作用。

在以下示例中,假设“pybot.py”是定义变量version的模块:

>>> import pybot
>>> print pybot.version
1.0
>>> # edit pybot.py to change version to 1.1
... 
>>> reload(pybot)
<module 'pybot' from 'pybot.py'>
>>> print pybot.version
1.1

答案 1 :(得分:1)

您可以使用os.execl或os.execv启动新进程(替换旧进程),而不是重新加载模块:

os.execl("/path/to/pybot.py", "pybot.py")

但我认为你最好不要把它从pybot中删除。只需让你的程序将其PID(通过os.getpid()提供)保存到文件中;然后编写一个单独的脚本来读取PID,杀死并重新启动你的程序。在unix系统上,它可以像这样简单:

#!/bin/sh
kill -9 `cat pybot.pid`
python pybot.py &

答案 2 :(得分:0)

内置函数重载(模块)重新加载必须在

之前成功导入的MODULE

所以我可以建议:

  1. 使用核心功能
  2. 创建bot_core.py模块
  3. 创建另一个最小的bot_main.py模块(并且你不想更改它),它将加载模块bot_core,然后使用它的函数
  4. 每次要重新加载bot_core时,请使用reload