Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在生产环境中禁用pyc文件_Python_Python 2.7_Pyc - Fatal编程技术网

Python 在生产环境中禁用pyc文件

Python 在生产环境中禁用pyc文件,python,python-2.7,pyc,Python,Python 2.7,Pyc,pyc文件在过去一直是令人悲伤的原因,我最近刚刚看到一些关于阻止python生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但一般来说禁用它们要容易得多。在我们的生产环境中禁用它们是否有我不知道的副作用?这样做的缺点是什么 我们遇到的唯一真正的问题是,有时文件会过时,导致导入错误,并且在大规模重构后很难调试。一旦意识到这是一个pyc问题,这是一个足够简单的修复方法,只需运行脚本,但在调试过程中可能需要30分钟才能实现 您可以尝试将以下代码添加到主应用程序

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


我们遇到的唯一真正的问题是,有时文件会过时,导致导入错误,并且在大规模重构后很难调试。一旦意识到这是一个pyc问题,这是一个足够简单的修复方法,只需运行脚本,但在调试过程中可能需要30分钟才能实现

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

import sys
sys.dont_write_bytecode=True
或设置环境变量:

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

import sys
sys.dont_write_bytecode=True
也可以传递
“-B”
选项。
至于删除或禁用.pyc生成,影响似乎很小或难以区分。生成.pyc是为了提高速度。不是程序的速度,而是加载所需的时间。如果您经常导入模块,则建议使用.pyc,因为它可以缩短所述模块的加载时间。经过研究,使用/generating.pyc似乎没有其他好处。

禁用编译字节码的编写和使用在启动时会带来性能成本——进程生成时,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
文件)没有明显区别,但至少在这种情况下,您只需支付一次导入/解析/编译价格


在您在评论中提到的情况下,如果您正在“炮轰”操作系统以调用Python脚本,并且不允许在该调用中编写字节码,则每次调用都会产生编译代价。

我熟悉如何禁用它们,但我正在寻找这样做的潜在副作用。@electrometro更新了。有时在用Git检查新代码后,它们不会被重新编译。有时,导致这些导入错误的原因是
pyc
文件,这可能是一个非常令人头痛的问题。尤其是在大规模重构之后。啊,好吧,我可以看到这种情况发生了。如果不允许写入字节码文件,则主要更改是增加启动时间。如果您的应用程序在生产环境中引发异常,并且您依赖它来重新启动,这一点非常重要。使用
popen
运行python脚本会产生什么影响?我们经常这样做。同样的事情--
Popen(['python','my_script.py'])
遵循与调用
python my_script.py
加载
my_script
并将其导入内存相同的规则。在不允许保存字节码的情况下,它必须在每次调用时解析/编译每个源文件——只是更长的启动时间。好的,所以这一切都可能会“更慢”,您是否知道任何关于慢多少的文档?我试着用谷歌搜索,但结果空手而归。我意识到这会因应用程序和脚本的不同而大不相同。你能更详细地描述一下你与他们之间的问题吗?可能有一个更好的选择,就是禁用它们。可能会复制