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

如何防止python使用孤立的.pyc文件?(没有匹配的.py文件的文件),python,bytecode,pyc,Python,Bytecode,Pyc,偶尔我会遇到一个很难调试的问题:在我的$PYTHONPATH中的某个地方有一个剩余的.pyc文件,而匹配的.py文件已被移动到稍后在$PYTHONPATH中的其他地方-因此,当我尝试导入模块时,会使用“孤立的”.pyc文件,并忽略对“真实的”.py文件所做的所有更改,这让我非常困惑,直到我明白这是怎么回事 有没有办法使python不使用“孤立的”.pyc文件,或者在使用它们时打印警告? 或者,我有这个问题的事实是否意味着我做错了什么,如果是,那又是什么呢?试试这个(): pythondotwri

偶尔我会遇到一个很难调试的问题:在我的$PYTHONPATH中的某个地方有一个剩余的.pyc文件,而匹配的.py文件已被移动到稍后在$PYTHONPATH中的其他地方-因此,当我尝试导入模块时,会使用“孤立的”.pyc文件,并忽略对“真实的”.py文件所做的所有更改,这让我非常困惑,直到我明白这是怎么回事

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

试试这个():

pythondotwritebytecode

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

版本2.6中的新功能


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

如果Python在其路径中找到.pyc文件,则无法阻止加载它们,否

您有几个选择:

  • 导入有问题的模块并找出其路径:

    >>> import borkenmod
    >>> import sys
    >>> sys.modules[borkenmod.__name__].__file__
    'lib/python2.7/borkenmod.pyc'
    
  • 使用一个。链接脚本将删除所有不存在相应
    .py
    文件的
    .py
    文件

  • 擦除PYTHONPATH中的所有.pyc文件,并让Python使用以下命令重新生成它们:

    然后删除那个文件


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

    这会阻止写入新的.pyc文件,但会阻止python加载它们吗?这不会阻止python加载现有的.pyc文件。我刚刚用Python2.6.8和2.7.3进行了测试,我担心这是我唯一的选择。。。不过,很高兴了解pythondotwritebytecode env变量!我现在可能会使用它(在删除所有现有的.pyc文件之后),直到我开始编写清理脚本并将其粘贴到我的cron或其他东西中。Wipe+compileall可能有些过分-我可能应该只编写一些东西来擦除孤立的文件。谢谢你的sys.modules技巧!这应该很有用——至少在我发现加载了错误的文件之后。这不会从子目录中删除pyc文件(在rm命令看到参数之前,shell首先展开*.pyc)。改用
    find*-name'*.pyc'| xargs rm-f
    。注1。我使用
    find*
    而不是
    find.
    ,这样就不会搜索.git等。我删除了所有pyc文件,因为python似乎只检查源代码是否比编译的文件旧,而不是完全匹配mod time(因为它在创建pyc文件时不匹配mtime,至少在linux下是这样)。
    find-名称'*pyc'-delete
    -显然
    find
    有一个用于删除找到的文件的标志
    python -m compileall [path]