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

时间:2013-07-15 20:53:00

标签: python reload imp

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

3 个答案:

答案 0 :(得分:3)

是肯定的。以下是您可以使用的内容the -B command line option

python -B

或使用PYTHONDONTWRITEBYTECODE environment option

export PYTHONDONTWRITEBYTECODE=1

这些确保首先不生成.pyc个文件。

答案 1 :(得分:0)

如果你正在使用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)
...

只需要重新加载模块就可以调用它。

答案 2 :(得分:0)

您不需要删除过时的* .pyc,因为重新加载(模块)会自动执行此操作。

为此,我通常使用类似的东西:

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

        call_later(1, reinit)

    reinit()