在生产中禁用pyc文件

时间:2016-06-07 03:10:03

标签: python python-2.7 pyc

pyc文件过去一直是悲伤的原因,我刚刚看到一些关于阻止python生成它们的帖子。目前我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但一般情况下禁用它们要容易得多。在我们的生产环境中是否有任何副作用可能是我不知道的?这样做有什么缺点?

我们遇到的唯一真正问题是文件过时会导致导入错误,并且在大量重构后难以调试。一旦意识到这是一个pyc问题,这是一个简单的修复,只需运行脚本,但这种实现可能需要30分钟的调试时间。

2 个答案:

答案 0 :(得分:2)

您可以尝试将以下代码添加到主代码中。之后导入的任何模块都不会创建.pyc:

import sys
sys.dont_write_bytecode=True

或设置环境变量:

PYTHONDONTWRITEBYTECODE

您还可以编辑或创建usercustomize.py中找到的/site-packages以包含:

import sys
sys.dont_write_bytecode=True

也可以传递"-B"选项。 至于删除或禁用.pyc生成,其影响似乎很小或难以区分。生成.pyc以提高速度。不是程序的速度,而是加载所需的时间。如果你经常importing一个模块,那么建议使用.pyc,因为它减少了所述模块的加载时间。经过研究,似乎没有其他好处使用/生成.pyc' s。

答案 1 :(得分:2)

禁用编译和使用已编译的字节码会在启动时带来性能成本 - 当进程生成时,您的Python代码会加载到内存中,而非.pyc / .pyo文件意味着解释器被强制解析每个导入的启动时的文件。如果您当前正在从代码目录和导入中删除所有.pyc和.pyo文件,那么您已经强制执行此版本。

我很好奇他们过去曾在哪里引起过悲伤(你是否在文件系统上禁用了修改时间?)好像.py文件比.pyc文件更新, Python解释器(至少在常见的实现中,包括CPython)将重新编译源代码,但这对于这个问题的范围并不是很重要。

如果您在函数后面导入,例如:

def my_database_call(budget_id):
    import some_expensive_module_to_import
    some_orm(...).get(budget_id)

在调用该函数之前不会产生导入成本(也许,每个后续时间也是如此)。这与您允许字节码(.pyc或“优化的”.pyo文件)没有明显的不同,但至少在这种情况下,您只需支付该导入/解析/编译价格一次。

如果你在评论中提到的话,如果你“掏出”到OS来调用Python脚本,并且不允许在该调用中写入字节码,则每次调用都会产生编译价格。 / p>