【问题标题】:Make python reload() function read from .py instead of .pyc使 python reload() 函数从 .py 而不是 .pyc 读取
【发布时间】:2013-07-13 21:03:30
【问题描述】:

我写了一个相当大的模块,当我导入它时它会自动编译成一个 .pyc 文件。

当我想在解释器中测试模块的特性时,例如类方法,我使用 imp 包中的 reload() 函数。

问题在于它重新加载了.pyc 文件,而不是.py 文件。

例如,我在解释器中尝试了一个函数,发现它不能正常工作,我将对.py 文件进行更改。但是,如果我在解释器中重新加载模块,它会重新加载 .pyc 文件,这样更改就不会反映在解释器中。我将不得不退出解释器,重新启动它并使用import 加载模块(并从.py 文件创建.pyc 文件)。或者,我每次都必须删除 .pyc 文件。

有没有更好的方法?例如,让reload() 更喜欢.py 文件而不是.pyc 文件?

这是解释器会话中的一个例外,它显示reload() 加载了.pyc 文件。

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

编辑: 而且即使我删除了.pyc文件,每次使用reload时都会创建另一个.pyc文件,所以我每次使用reload时都必须删除.pyc文件。

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

【问题讨论】:

  • 删除.pyc文件?
  • 是的,我在帖子中提到过,但是,有时我需要/想用这个模块打开另一个交互式 shell 来尝试一些东西。然后会创建一个新的pyc文件。
  • How to avoid .pyc files?的可能重复

标签: python reload imp


【解决方案1】:

是的。这里有一些你可以使用的东西the -B command line option:

python -B

或使用PYTHONDONTWRITEBYTECODE environment option:

export PYTHONDONTWRITEBYTECODE=1

这些确保一开始就不会生成 .pyc 文件。

【讨论】:

    【解决方案2】:

    如果您使用的是 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)
    ...
    

    只要你想重新加载你的模块就调用它。

    【讨论】:

    • 我不喜欢 iPython(它可能对教学有好处,但不适合我个人使用),我只是在 bash 终端中打开 python。但是谢谢。
    • @astrognocci,这两个重载关键字不会冲突吗?我认为它会调用自己,而不是 system reload 关键字。
    • 函数的第二行应该是'rm ' + module_name.__name__ + '.pyc'
    【解决方案3】:

    您不需要删除过时的 *.pyc,因为 reload(module) 会自动执行此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多