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

wer*_*ika 18 python bytecode pyc

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

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

ziz*_*ozu 6

试试这个(见这里):

PYTHONDONTWRITEBYTECODE

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

2.6版中的新功能.

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


Mar*_*ers 6

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

你有几个选择:

  1. 导入违规模块并找出它的路径:

    >>> import borkenmod
    >>> import sys
    >>> sys.modules[borkenmod.__name__].__file__
    'lib/python2.7/borkenmod.pyc'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用脚本遍历PYTHONPATH并删除过时的字节码文件.链接脚本将删除没有相应文件的所有 .pyc文件.py.

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

    python -m compileall [path]
    
    Run Code Online (Sandbox Code Playgroud)

    然后删除那个文件.

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