2012-02-20 82 views
2

我正在一個小型的IRC機器人上做一些簡單的事情,我發現它很煩人,每次我想測試任何更改時,我必須找到該過程,殺死它,再次啓動機器人並等待它連接。我試圖讓一個命令它是重載Python的文件,因此任何更改將被保存,我可以更輕鬆地編輯它的方式,但使用此代碼時,試圖重新加載:有沒有辦法在Python中重新加載「當前」文件?

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

我得到這個錯誤:

TypeError: reload() argument must be module 

這個機器人所使用的唯一文件是它自己的,pybot.pyiblib module和其他一些Python庫。

我的問題是,有什麼辦法讓Python重新加載它當前正在使用的文件,而不是一個模塊?

+0

對我來說,這聽起來像是一件很快就會導致雞與雞蛋問題的東西。 – Kimvais 2012-02-20 14:32:50

回答

0

內置函數重載(模塊)會將該以前一定

所以成功導入什麼我可以建議一個模塊:

  1. 創建核心功能的bot_core.py模塊
  2. 創建另一個bot_main.py模塊將會很小(並且你不會想改變它),它會加載模塊bot_core,然後使用它的功能
  3. 每次你想重新加載bot_core,使用重載
3

根據錯誤,「pybot」不引用模塊。如果您要重新加載的模塊的名稱實際上是「pybot」,那麼在您成功執行「導入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

相反重裝模塊,則可以開始新的過程(替換舊)與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 & 
相關問題