我正在研究一个小型的IRC机器人,做一些简单的事情,我觉得很烦人,每次我想测试任何变化,我必须找到进程,杀死它,再次启动机器人并等待它连接。我尝试为它重新加载Python文件的命令,以便保存任何更改,我可以更容易地编辑它,但是当使用此代码尝试重新加载时:
def reload(self, *args):
reload(pybot)
return "Reloaded!"
我收到此错误:
TypeError: reload() argument must be module
这个机器人使用的唯一文件是它自己的pybot.py
,iblib module和其他一些python库。
我的问题是,有没有办法让Python重新加载当前使用的文件,而不是模块?
答案 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所以我可以建议: