让Python忽略.pyc文件

时间:2010-08-17 15:11:38

标签: python pyc

有没有办法让Python忽略任何存在的.pyc文件,并且总是直接解释所有代码(包括导入的模块)?谷歌没有提出任何答案,所以我怀疑没有,但似乎值得问以防万一。

(为什么我要这样做?我有一大堆Python脚本,它们在几百台计算机的集群上重复运行.Python脚本本身存在于一个共享的NFS文件系统上。不知何故,很少有在几个小时内运行了数百次,它们会突然开始崩溃,导致无法导入模块的错误。强制重新生成.pyc文件可以解决问题。当然,我想要修复根本原因,但与此同时我们还需要系统继续运行,所以如果可能的话,忽略.pyc文件似乎是一个合理的解决方法。)

P.S。我使用的是Python 2.5,所以我不能使用-B。

6 个答案:

答案 0 :(得分:12)

可以使用标准Python库的imp模块来重新实现__builtins__.__import__,这是由importfrom语句调用的钩子函数。特别是,即使存在相应的.pyimp.load_module函数也可用于加载.pyc。请务必仔细研究我指出的页面中的所有文档,以及import的文档,因为这是一项微妙的工作。文档本身建议使用导入钩子(根据PEP 302)但是对于这个特定的任务我怀疑会更难。

BTW,可能导致您观察到的问题的原因包括同时试图写.pyc个文件的不同计算机之间的竞争条件 - NFS锁定是众所周知的,并且一直是;-)。只要您使用的每个Python编译器都使用相同版本(如果没有,无论如何都会遇到大麻烦;-),我宁愿将所有这些.py文件预编译到.pyc中并使其目录为只读;后者似乎是最简单的方法(而不是黑客__import__),即使由于某种原因你无法预编译。

答案 1 :(得分:11)

这不完全是你要求的,但会删除现有的.pyc文件,然后不再为你创建任何工作?在这种情况下,您可以使用-B选项:

>python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x

答案 2 :(得分:5)

如果有人使用相同的问题使用python 2.6或更高版本,最简单的事情是:

  1. 删除所有.pyc文件
  2. 使用-B选项运行所有python解释器,这样它们就不会生成.pyc文件。
  3. 来自文档:

      

    -B   如果给定,Python将不会尝试在导入源模块时编写.pyc或.pyo文件。另见PYTHONDONTWRITEBYTECODE。

         

    2.6版中的新功能。

    如果您无法删除所有.pycs,那么您可以:

    1)使用-B -O选项运行所有python解释器。

    这将告诉python查找字节码的.pyo文件而不是.pyc文件(-O)并告诉python不要生成任何字节码文件(-B)。

    假设您以前没有使用它们,两个选项的组合是Python不会生成任何字节码文件,也不会查找旧运行生成的字节码文件。

    来自文档:

      

    -B   如果给定,Python将不会尝试在导入源模块时编写.pyc或.pyo文件。另见PYTHONDONTWRITEBYTECODE。

         

    2.6版中的新功能。

         

    -O   打开基本优化。这会将已编译(字节码)文件的文件扩展名从.pyc更改为.pyo。另见PYTHONOPTIMIZE。

答案 3 :(得分:0)

也许您可以解决此问题,例如,安排作业以定期关闭脚本并删除.pyc文件。

答案 4 :(得分:0)

好吧,如果您从文件加载代码,我认为Python不会直接解释代码。即使使用交互式shell,Python也会将导入的模块编译为.pyc。

也就是说,您可以在启动脚本之前编写一个shell脚本继续并删除所有.pyc文件。这肯定会在每次执行之前强制完全重建。

答案 5 :(得分:0)

从Python 3.2开始,您可能会发现PEP 3147 - PYC Repository Directories非常感兴趣。