有没有办法让Python忽略任何存在的.pyc文件,并且总是直接解释所有代码(包括导入的模块)?谷歌没有提出任何答案,所以我怀疑没有,但似乎值得问以防万一.
(为什么我要这样做?我有一大堆Python脚本,它们在几百台计算机的集群上重复运行.Python脚本本身存在于一个共享的NFS文件系统上.不知怎的,很少,在运行了数百台之后几个小时的时间,它们会突然开始崩溃,导致无法导入模块的错误.强制重新生成.pyc文件可以解决问题.当然,我想修复根本原因,但是同时我们还需要系统继续运行,所以如果可能的话,忽略.pyc文件似乎是一个合理的解决方法).
PS我正在使用Python 2.5,所以我不能使用-B.
Ale*_*lli 13
您可以使用标准Python库的imp模块来重新实现__builtins__.__import__,这是由with import和fromstatement 调用的钩子函数.特别是,当相应的存在时,imp.load_module函数可用于加载.py偶数.pyc.请务必仔细研究我指出的页面中的所有文档,以及导入的文档,因为这是一项微妙的工作.文档本身建议使用导入钩子(根据PEP 302)但是对于这个特定的任务我怀疑会更难.
BTW,可能导致您观察到的问题包括同时尝试写.pyc文件的不同计算机之间的竞争条件- NFS锁定是众所周知的,并且一直是;-).只要您使用的每个Python编译器都处于相同版本(如果没有,无论如何都会遇到大麻烦;-),我宁愿将所有这些.py文件预编译到其中.pyc并使其目录为只读; 后者似乎是最简单的方法(而不是黑客__import__),即使由于某种原因你不能预编译.
Bla*_*rad 12
这不完全是你要求的,但会删除现有的.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
Run Code Online (Sandbox Code Playgroud)
如果有人使用相同的问题使用python 2.6或更高版本,最简单的方法是:
-B选项运行所有python解释器,因此它们不会生成.pyc文件.来自文档:
-B如果给定,Python将不会尝试在导入源模块时编写.pyc或.pyo文件.另见PYTHONDONTWRITEBYTECODE.
2.6版中的新功能.
如果您无法删除所有.pycs,那么您可以:
1)使用-B -O选项运行所有python解释器.
这将告诉python查找字节码的.pyo文件而不是.pyc files(-O)并告诉python不要生成任何字节码文件(-B).
两个选项的组合(假设您以前没有使用它们)是Python不会生成任何字节码文件,也不会查找旧运行生成的字节码文件.
来自文档:
-B如果给定,Python将不会尝试在导入源模块时编写.pyc或.pyo文件.另见PYTHONDONTWRITEBYTECODE.
2.6版中的新功能.
-O启用基本优化.这会将已编译(字节码)文件的文件扩展名从.pyc更改为.pyo.另见PYTHONOPTIMIZE.