如何防止python使用孤立的.pyc文件? (没有匹配的.py文件)

时间:2012-05-28 18:47:56

标签: python bytecode pyc

有一段时间我遇到了一个非常难以调试的问题:我的$ PYTHONPATH中有一个剩余的.pyc文件,并且匹配的.py文件已被移动到稍后在$ PYTHONPATH的其他地方 - 所以当我尝试导入模块时,使用“孤立”.pyc文件,并且忽略对“真实”.py文件的所有更改,让我感到非常困惑,直到我发现正在发生的事情。

有没有办法让python 使用“孤儿”.pyc文件,或在使用时打印警告?
或者,我有这个问题的事实是否意味着我做错了什么,如果有的话,是什么?

2 个答案:

答案 0 :(得分:6)

试试这个(see here):

  

PYTHONDONTWRITEBYTECODE

     

如果设置了此项,Python将不会尝试在导入源模块时编写.pyc.pyo个文件。这相当于   指定-B选项。

     

2.6版中的新功能。

但是有一个问题与之相关:你将失去拥有.pyc文件的好处(从而失去性能)。更好,更清洁,更友好的方法是遍历目录并清除您不需要的孤立.pyc文件。您应该使用脚本执行此操作,并确保没有.pyc个与.py个文件无关的文件(例如,某些级别的混淆)。

答案 1 :(得分:6)

你无法阻止Python加载.pyc文件,如果它在路径中找到它们,没有。

您有几个选择:

  1. 导入有问题的模块,找出它的路径:

    >>> import borkenmod
    >>> import sys
    >>> sys.modules[borkenmod.__name__].__file__
    'lib/python2.7/borkenmod.pyc'
    
  2. 使用script to walk your PYTHONPATH and delete stale bytecode files。链接脚本会删除所有 .pyc文件,而这些文件中没有相应的.py文件。

  3. 擦除PYTHONPATH中的所有.pyc文件,让Python使用compileall module重新生成它们:

    python -m compileall [path]
    

    然后删除那个文件。

  4. 请注意,最后两个选项可能会导致删除合法的python模块!一些python模块(特别是商业许可)仅作为编译的字节码分发。