如何避免.pyc文件?

时间:2008-09-30 18:55:59

标签: python

我可以在不生成已编译的.pyc文件的情况下运行python解释器吗?

10 个答案:

答案 0 :(得分:281)

来自"What’s New in Python 2.6 - Interpreter Changes"

  

现在可以阻止Python了   写.pyc或.pyo文件   将-B开关提供给Python   口译员,或通过设置   PYTHONDONTWRITEBYTECODE环境   运行之前的变量   翻译。此设置可用   以Python程序为例   sys.dont_write_bytecode变量,和   Python代码可以将值更改为   修改口译员的行为。

2010-11-27更新:Python 3.2通过引入特殊的.pyc子文件夹解决了使用__pycache__文件混乱源文件夹的问题,请参阅What's New in Python 3.2 - PYC Repository Directories

答案 1 :(得分:100)

import sys

sys.dont_write_bytecode = True

答案 2 :(得分:22)

实际上有一种方法可以在Python 2.3+中实现,但它有点深奥。我不知道你是否意识到这一点,但你可以做到以下几点:

$ unzip -l /tmp/example.zip
 Archive:  /tmp/example.zip
   Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32) 
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip')  # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'

根据zipimport图书馆:

  

ZIP存档中可能存在任何文件,但只有文件.py和.py [co]可供导入。不允许ZIP导入动态模块(.pyd,.so)。请注意,如果存档仅包含.py文件,则Python不会尝试通过添加相应的.pyc或.pyo文件来修改存档,这意味着如果ZIP存档不包含.pyc文件,则导入可能会相当慢。

因此,您所要做的就是压缩文件,将zipfile添加到sys.path然后导入它们。

如果您正在为UNIX构建此代码,您可能还会考虑使用此配方打包脚本:unix zip executable,但请注意,如果您计划使用stdin或从sys读取任何内容,则可能需要调整它。 args(可以毫不费力地完成)。

根据我的经验,性能不会因此而受到太大影响,但在以这种方式导入任何非常大的模块之前,您应该三思而后行。

答案 3 :(得分:11)

在2.5中,没有办法压制它,除了不给用户写目录的访问权限等措施。

但是在python 2.6和3.0中,sys模块中可能有一个名为“dont_write_bytecode”的设置可以设置为禁止此设置。这也可以通过传递“-B”选项或设置环境变量“PYTHONDONTWRITEBYTECODE”来设置

答案 4 :(得分:6)

您可以在源代码中设置sys.dont_write_bytecode = True,但这必须在加载的第一个python文件中。如果您执行python somefile.py,则不会获得somefile.pyc

使用setup.pyentry_points=安装实用程序时,您将在启动脚本中设置sys.dont_write_bytecode。所以你不能依赖"默认" setuptools生成的启动脚本。

如果你自己用python文件作为参数启动Python,你可以指定-B

python -B somefile.py
无论如何都不会生成

somefile.pyc,但也没有导入其他文件的.pyc个文件。

如果你有一些实用程序myutil并且你无法改变它,它将不会将-B传递给python解释器。只需通过设置环境变量PYTHONDONTWRITEBYTECODE

即可启动它
PYTHONDONTWRITEBYTECODE=x myutil

答案 5 :(得分:3)

我在测试套件中有几个测试用例,之前我在Mac终端中运行测试套件,如下所示:

python LoginSuite.py

以这种方式运行命令我的目录正在填充.pyc文件。我尝试了下面提到的方法,它解决了这个问题:

python -B LoginSuite.py

如果要将测试用例导入测试套件并在命令行上运行套件,则此方法有效。

答案 6 :(得分:2)

Python 3.8 开始,您可以使用环境变量PYTHONPYCACHEPREFIX为Python定义一个缓存目录。

来自Python文档:

  

如果设置了该选项,Python将在此路径的镜像目录树中而不是在源树的 pycache 目录中写入.pyc文件。这等效于指定-X pycache_prefix = PATH选项。

示例

如果将以下行添加到Linux中的./profile

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Python不会在您的项目目录中创建烦人的__pycache__目录,而是将它们全部放在~/.cache/cpython/

答案 7 :(得分:1)

对于运行Python解释器的用户,您可以将模块所在的目录设置为只读。

我认为没有更优雅的选择。 PEP 304似乎试图为此引入一个简单的选项,但它似乎已被放弃。

我想你可能还有其他一些问题需要解决,因此禁用.py [co]似乎是一种解决方法,但攻击这个原始问题可能会更好。

答案 8 :(得分:0)

据我所知,python将编译你“导入”的所有模块。但是python不会编译运行python脚本使用:“python script.py”(但它会编译脚本导入的任何模块)。

真正的问题是为什么你不想让python编译模块?如果他们挡路的话,你可以自动化一种清理它们的方法。

答案 9 :(得分:0)

ipython 6.2.1 using python 3.5.2的解决方案(在Ubuntu 16.04和Windows 10上测试):

Ipython如果在%env PYTHONDONTWRITEBYTECODE =1解释程序中设置或在ipython启动期间不尊重~/.ipython/profile-default/startup/00-startup.ipy。 而是在~.ipython/profile-default/startup/00-startup.py

中使用以下内容
import sys
Sys.dont_write_bytecode=True