有没有办法让Python忽略任何存在的.pyc文件,并且总是直接解释所有代码(包括导入的模块)?谷歌没有提出任何答案,所以我怀疑没有,但似乎值得问以防万一。
(为什么我要这样做?我有一大堆Python脚本,它们在几百台计算机的集群上重复运行.Python脚本本身存在于一个共享的NFS文件系统上。不知何故,很少有在几个小时内运行了数百次,它们会突然开始崩溃,导致无法导入模块的错误。强制重新生成.pyc文件可以解决问题。当然,我想要修复根本原因,但与此同时我们还需要系统继续运行,所以如果可能的话,忽略.pyc文件似乎是一个合理的解决方法。)
P.S。我使用的是Python 2.5,所以我不能使用-B。
答案 0 :(得分:12)
你可以使用标准Python库的imp模块来重新实现__builtins__.__import__
,这是由import
和from
语句调用的钩子函数。特别是,即使存在相应的.py
,imp.load_module函数也可用于加载.pyc
。请务必仔细研究我指出的页面中的所有文档,以及import的文档,因为这是一项微妙的工作。文档本身建议使用导入钩子(根据PEP 302)但是对于这个特定的任务我怀疑会更难。
.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或更高版本,最简单的事情是:
-B
选项运行所有python解释器,这样它们就不会生成.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。
答案 3 :(得分:0)
也许您可以解决此问题,例如,安排作业以定期关闭脚本并删除.pyc文件。
答案 4 :(得分:0)
好吧,如果您从文件加载代码,我认为Python不会直接解释代码。即使使用交互式shell,Python也会将导入的模块编译为.pyc。
也就是说,您可以在启动脚本之前编写一个shell脚本继续并删除所有.pyc文件。这肯定会在每次执行之前强制完全重建。
答案 5 :(得分:0)
从Python 3.2开始,您可能会发现PEP 3147 - PYC Repository Directories非常感兴趣。