我写了一个相当大的模块,当我导入它时,它会自动编译成.pyc文件。
当我想在解释器中测试模块的功能时,例如类方法,我使用imp
包中的reload()
函数。
问题是它重新加载了.pyc
文件,而不是.py
文件。
例如,我在解释器中尝试了一个函数,发现它不能正常工作,我会对.py
文件进行更改。但是,如果我在解释器中重新加载模块,它会重新加载.pyc
文件,这样更改就不会反映在解释器中。我必须退出解释器,重新启动它,然后使用import
加载模块(并从.py
文件创建.pyc
文件)。或者,我每次都必须删除.pyc
文件。
有更好的方法吗?例如,使reload()
更喜欢.py
文件而不是.pyc
文件?
这里有一个来自解释器会话的except,它显示reload()
加载.pyc
文件。
>>> reload(pdb)
<module 'pdb' from 'pdb.pyc'>
编辑:即使我删除了.pyc
文件,每次使用reload时也会创建另一个.pyc
文件,因此每次使用relload时我都必须删除.pyc
文件。
>>> reload(pdb)
<module 'pdb' from 'pdb.py'>
>>> reload(pdb)
<module 'pdb' from 'pdb.pyc'>
是。以下是可以使用-B
命令行选项的内容:
python -B
或者使用PYTHONDONTWRITEBYTECODE
环境选项:
export PYTHONDONTWRITEBYTECODE=1
这些确保了CCD_ 21文件不是首先生成的。
如果您使用的是ipython,您可以在shell命令前面加上!
所以你可以做
>>> !rm some_file.pyc
>>> reload(some_file)
或者,您可以在当前shell中定义一个快速函数:
>>> import os
>>> def reload(module_name):
... os.system('rm ' + module_name + '.pyc')
... reload(module_name)
...
只要您想重新加载模块,就可以调用它。
您不需要删除过时的*.pyc,因为reload(module)会自动执行此操作。
出于这个目的,我通常使用以下内容:
import module
def reinit():
try:
reload(module)
except:
import traceback
traceback.print_exc()
call_later(1, reinit)
reinit()