有没有办法使Python忽略存在的任何.pyc文件,并始终直接解释所有代码(包括导入的模块)? Google没有得到任何答案,所以我怀疑没有,但似乎值得一提的。

(我为什么要这样做?我有大量的python脚本管道,这些脚本在几百台计算机的集群中反复运行。python脚本本身生活在共享的NFS文件系统上。不知何故,在运行了数百个之后,很少有在几个小时的时间里,他们会突然开始崩溃,因为无法导入模块。同时,我们还需要系统继续运行,因此,如果可能的话,似乎忽略了.pyc文件将是合理的解决方法)。

PS我使用的是Python 2.5,所以我不能使用-b。

有帮助吗?

解决方案

可以 使用标准Python库的IMP模块重新进化 __builtins__.__import__, ,这是调用的挂钩函数 importfrom 陈述。特别是 imp.load_module 功能可用于加载 .py 即使相应 .pyc 存在。确保仔细研究我指出的页面中的所有文档,以及这些文档 进口, ,因为这是一项微妙的工作。文档本身建议使用导入挂钩(按PEP 302),但是对于这项特定任务,我怀疑这会更加困难。

顺便说一句,您观察到的问题的可能原因包括试图写作的不同计算机之间的竞赛条件 .pyc 文件同时 - 众所周知,NFS锁定是片状的,并且一直存在;-)。只要您使用的每个Python编译器都处于同一版本(如果没有的话,无论如何您都遇到了大麻烦;-),我宁愿将所有这些 .py 文件进入 .pyc 并使他们的目录只读;无论如何,后者似乎是最简单的方法(而不是黑客 __import__),即使出于某种原因,您无法预编译。

其他提示

这并不是您要求的,而是删除现有的.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

如果任何人都使用python 2.6或以上有相同的问题,最简单的事情是:

  1. 删除所有.PYC文件
  2. 将所有Python口译员与 -B 选项,因此它们不会生成.pyc文件。

从文档中:

-b如果给出,Python不会尝试在源模块的导入上编写.pyc或.pyo文件。另请参见PythondontwriteByTecode。

2.6版中的新版本。

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

1)与 -B -O 选项。

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

假设您以前从未使用过这两个选项的组合,就是Python不会生成任何字体模式文件,并且不会寻找旧运行本来会生成的字体模式文件。

从文档中:

-b如果给出,Python不会尝试在源模块的导入上编写.pyc或.pyo文件。另请参见PythondontwriteByTecode。

2.6版中的新版本。

- O打开基本优化。这将编译(bytecode)文件的文件名扩展从.pyc更改为.pyo。另请参见pythonoptimize。

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

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

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

您可能会发现 PEP 3147 -PYC存储库目录 从Python 3.2开始引起极大的兴趣。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top