Friday, May 6, 2011

How to reload python modules?

在寫 Wing IDE -Maya Python scripting 的好幫手 時有提到要如何修改 Python 的 script 後而不需重啟 Maya 的方法,主要是使用 reload 這個 function,但很快的就會發現當你的 script 也有 import 到別的 module 時,這個方法就行不通了,因為 module 之間有先後順序的依存關係,先 reload module A 和先 reload module B 會導至不同的結果,這個問題困擾了我許多,最後在 Reloading Python Modules 這篇文章找到一個不錯的解法 (不確定是不是最好的解法,但已足夠我目前的使用)
簡單說明一下要如何漂亮的 reload modules,最關鍵的一步就是在每次 import module 就將這個 module 記錄在一個 dictionary 裡,然後在需要 reload 的時候,就以 import 時相反的順序一個一個 reload 回去,要做到這樣的事需將 Python 的 builtins.__import__ 導到另一個自行定義的 import function 裡,原文的作者也有分享這個 reloader 在 https://github.com/jparise/python-reloader 有興趣的人也可以直接去下載來試試看,使用方法很簡單,解壓縮後我是執行 mayapy setup.py install 就會將 reloader 這個 module 裝到你的 Maya Python 目錄底下,然後在 usersetup.py 裡加上

import reloader
reloader.enable()

之後,只要呼叫到 import xxxModule, reloader 就會建立一個有關這個 xxxModule 的 dictionary,當有需要 reload 的時候,使用

reloader.reload(xxxModule)

就行了,之後在寫 python 的東西時,就可以邊改邊測試,方便多了 :D

2 comments:

Rais said...

reloader 這個組件 導致我的 import maya.mel as mm 不能正常工作

import maya.mel可以工作 但是當我:
print (maya.mel.__file)的時候
結果是D:\Program Files\Autodesk\Maya2010\Python\lib\site-packages\maya\__init__.pyc
當我 import maya.cmds的時候
結果依然是上述文件

烤焦的餅乾 said...

能否再提供一點更詳細的說明呢?
例如是在執行完 mayapy setup.py install 後 import maya.mel as mm 就無法正常工作,還是在啟動 reloader 之後才有問題,或是嘗試 reload maya.mel 或是 maya.cmds 後才發生這樣的情況,如果還是有問題,建議先將你的 D:\Program Files\Autodesk\Maya2010\Python\lib\site-packages\reloader 相關的 python 檔先移除,看 maya.mel 是不是能正常的運作,另外也可以使用
import sys
for module in sys.modules:
print module
來檢查 maya 的 modules 是不是都有正常的載入,希望有些幫助