我编写了一个相当大的模块,当我导入它时会自动编译成.pyc文件。
当我想在解释器中测试模块的功能时,例如类方法,我使用reload()
包中的imp
函数。
问题是它重新加载.pyc
文件,而不是.py
文件。
例如,我在解释器中尝试一个函数,发现它不能正常工作,我会对.py
文件进行更改。但是,如果我在解释器中重新加载模块,它会重新加载.pyc
文件,以便更改不会反映在解释器中。我必须退出解释器,再次启动并使用import
加载模块(并从.pyc
文件创建.py
文件)。或者,我每次都必须删除.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 :(得分:3)
是肯定的。以下是您可以使用的内容the -B
command line option:
python -B
或使用PYTHONDONTWRITEBYTECODE
environment option:
export PYTHONDONTWRITEBYTECODE=1
这些确保首先不生成.pyc
个文件。
答案 1 :(得分:0)
如果你正在使用ipython,你可以通过在!
所以你可以做到
>>> !rm some_file.pyc
>>> reload(some_file)
或者,您可以在当前shell中定义一个快速函数:
>>> import os
>>> def reload(module_name):
... os.system('rm ' + module_name + '.pyc')
... reload(module_name)
...
只需要重新加载模块就可以调用它。
答案 2 :(得分:0)
您不需要删除过时的* .pyc,因为重新加载(模块)会自动执行此操作。
为此,我通常使用类似的东西:
import module
def reinit():
try:
reload(module)
except:
import traceback
traceback.print_exc()
call_later(1, reinit)
reinit()