2010-08-17 233 views
21

有没有办法让Python忽略任何存在的.pyc文件,并且总是直接解释所有代码(包括导入的模块)?谷歌没有提供任何答案,所以我怀疑没有,但似乎值得提问以防万一。我为什么要这么做?我有一大堆Python脚本,它们通过几百台计算机的集群重复运行。Python脚本本身位于共享的NFS文件系统上。不知何故,很少在几个小时内运行了数百次,他们会突然开始崩溃,导致无法导入模块的错误,强制重新生成.pyc文件修复了这个问题,我当然想要解决这些问题的根本原因,但同时我们也需要系统继续运行,所以它似乎忽略.pyc文件如果可能将是一个合理的解决方法)。让Python忽略.pyc文件

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

回答

12

可能使用标准Python库的小鬼模块重新实现__builtins__.__import__,这是importfrom声明称钩子函数。特别是,即使在存在相应的.pyc时,imp.load_module函数也可用于加载.py。一定要仔细研究我指出的页面中的所有文档,以及import的文档,因为它是一种微妙的工作。文档本身建议使用导入钩子(每个PEP 302),但对于这个特定的任务,我怀疑这会更难。

顺便说一下,可能导致您观察到的问题包括尝试同时写入.pyc文件的不同计算机之间的竞争状况 - NFS锁定非常片状,一直都是;-)。只要你使用的每个Python编译器都在相同的版本(如果没有,你仍然有很大的麻烦;-),我宁愿预编译所有这些.py文件到.pyc,并使其目录只读;无论如何,后者似乎是最简单的方法(而不是黑客攻击),即使由于某种原因你不能预编译。

0

也许你可以通过调整作业来定期关闭脚本并删除.pyc文件。

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 
+0

这真的很棒,实际上,除了不幸的是由于我无法控制的原因,我被卡住了使用Python 2.5,它没有-B。应该提到的问题,对不起! – 2010-08-17 15:28:24

0

嗯,我不认为如果你从一个文件加载代码,Python会直接解释代码。即使使用交互式shell,Python也会将导入的模块编译为.pyc文件。这就是说,你可以编写一个shell脚本继续,并在启动脚本之前删除所有的.pyc文件。这肯定会在每次执行之前强制重建。

5

在任何人使用Python 2.6或以上相同的问题情况下,最简单的做法是:

  1. 删除所有pyc文件
  2. 运行所有Python解释与-B选项,因此他们不会生成.pyc文件。

从文档:

-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。