2013-07-15 60 views
4

我寫了一個相當大的模塊,當我導入它時,它會自動編譯到.pyc文件中。使python reload()函數從.py讀取而不是.pyc

當我想在解釋器中測試模塊的功能時,例如類方法,我使用imp包中的reload()函數。

問題是它重新加載了.pyc文件,而不是.py文件。

例如,我在解釋器中嘗試一個函數,發現它不能正常工作,我將對.py文件進行更改。但是,如果我在解釋器中重新加載模塊,它將重新加載.pyc文件,以便更改不會反映在解釋器中。我將不得不退出解釋器,再次啓動並使用import加載模塊(並從.py文件創建.pyc文件)。或者,我必須每次刪除.pyc文件。

有沒有更好的方法?例如,要使reload()更喜歡.py文件,而不是.pyc文件?

這是除口譯員會話之外,顯示reload()加載.pyc文件。

>>> reload(pdb) 
<module 'pdb' from 'pdb.pyc'> 

編輯: 即使我刪除.pyc文件,另一個.pyc文件將每次使用重新加載,使我不得不刪除每次使用重載時間.pyc文件時創建的。

>>> reload(pdb) 
<module 'pdb' from 'pdb.py'> 
>>> reload(pdb) 
<module 'pdb' from 'pdb.pyc'> 
+0

刪除'.pyc'文件? – kindall

+0

是的,我在我的文章中提到過,但是,有時我需要/想要打開另一個此模塊的交互式shell來嘗試一些東西。然後會創建一個新的pyc文件。 – Sebastian

+0

可能重複[如何避免.pyc文件?](http://stackoverflow.com/questions/154443/how-to-avoid-pyc-files) – dnozay

回答

0

,你可以可以通過!

所以它的前綴做一個shell命令,你可以做

>>> !rm some_file.pyc 
>>> reload(some_file) 

或者,你可以在當前的shell定義一個快捷功能:

>>> import os 
>>> def reload(module_name): 
...  os.system('rm ' + module_name + '.pyc') 
...  reload(module_name) 
... 

並調用它,只要你想重新加載模塊。

+0

我不喜歡iPython(它可能對教學有好處,但不喜歡個人使用),我只是在bash終端打開python。但是,thx。 – Sebastian

+0

@astrognocci,這兩個重載關鍵字不會衝突嗎?我認爲它會自己調用,而不是系統重載關鍵字。 – Zen

+0

並且函數中的第二行應該是''rm'+ module_name .__ name__ +'.pyc'' – Zen

0

您不需要刪除廢棄的* .pyc,因爲reload(模塊)會自動執行此操作。

爲此我通常使用類似:

import module 
    def reinit(): 
     try: 
      reload(module) 
     except: 
      import traceback 
      traceback.print_exc() 

     call_later(1, reinit) 

    reinit() 
相關問題