18

Once in a while I run into a very difficult-to-debug problem: there's a leftover .pyc file somewhere in my $PYTHONPATH, and the matching .py file has been moved to somewhere else that's later in $PYTHONPATH - so when I try to import the module, the "orphaned" .pyc file is used and all changes to the "real" .py file are ignored, leaving me incredibly confused until I figure out that's what's happening.

Is there any way of making python not use "orphaned" .pyc files, or print a warning when using them?
Alternatively, does the fact that I have this problem at all mean I'm doing something wrong, and if so, what?

4

2 回答 2

6

试试这个(见这里):

PYTHONDONTWRITEBYTECODE

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

2.6 版中的新功能。

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

于 2012-05-28T18:53:52.767 回答
6

如果 Python 在其路径中找到它们,则不能阻止 Python 加载 .pyc 文件,不。

你有几个选择:

  1. 导入有问题的模块并找出它的路径是什么:

    >>> import borkenmod
    >>> import sys
    >>> sys.modules[borkenmod.__name__].__file__
    'lib/python2.7/borkenmod.pyc'
    
  2. 使用脚本遍历您的 PYTHONPATH 并删除陈旧的字节码文件。链接脚本会删除不存在对应文件的所有 文件。.pyc.py

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

    python -m compileall [path]
    

    然后删除那个文件。

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

于 2012-05-28T19:22:55.017 回答