使python reload()函数从.py而不是.pyc读取



我写了一个相当大的模块,当我导入它时,它会自动编译成.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()

相关内容

  • 没有找到相关文章

最新更新