如何避免.pyc文件?

Avn*_*ner 261 python

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

Con*_*tin 283

"Python 2.6中的新功能 - 解释器更改":

现在可以通过向Python解释器提供-B开关,或者在运行解释器之前设置 PYTHONDONTWRITEBYTECODE环境变量来阻止Python编写.pyc或.pyo文件.此设置可用作Python程序的 sys.dont_write_bytecode变量,Python代码可以更改值以修改解释器的行为.

更新2010-11-27:Python 3.2 .pyc通过引入特殊的__pycache__子文件夹解决了使用文件混乱源文件夹的问题,请参阅Python 3.2中的新增功能 - PYC存储库目录.

  • 在OSX上也为我工作(10.8和10.10); @sorin你是否正确导出变量?`export PYTHONDONTWRITEBYTECODE = 1` (7认同)
  • 如果您正在嵌入解释器(在C++程序中),请使用"Py_DontWriteBytecodeFlag = 1;" 在您的源代码中.这是在pydebug.h中声明的全局int. (5认同)
  • 你知道如何用 pytest 做同样的事情吗? (2认同)

小智 105

import sys

sys.dont_write_bytecode = True
Run Code Online (Sandbox Code Playgroud)

  • 我刚试过这个,它确实适用于导入的模块.具体来说,一旦设置了此变量,以后导入的任何内容都不会生成pyc文件.这很愉快.谢谢. (25认同)
  • 将其添加到您的`site-packages/usercustomize.py`,以使其适用于您的所有脚本.对我来说,这个目录是`$ HOME/.local/lib/python2.6/site-pacakges/usercustomize.py`.参看 http://docs.python.org/2/tutorial/interpreter.html#the-customization-modules (4认同)
  • 我的网站包位于:/usr/local/lib/python2.7/site-packages,我不得不创建usercustomize.py (3认同)
  • 或者在一行中:`import sys; sys.dont_write_bytecode = True` (3认同)

Jas*_*ker 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'
Run Code Online (Sandbox Code Playgroud)

根据zipimport库:

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

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

如果你是为UNIX构建这个,你也可以考虑使用这个配方打包你的脚本: unix zip executable,但是请注意,如果你计划使用stdin或从sys.args读取任何内容,你可能需要调整它(它可以是完成没有太多麻烦).

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


Bri*_*ian 11

在2.5中,除了不向用户提供对目录的写访问权之类的措施之外,没有办法压制它.

但是在python 2.6和3.0中,sys模块中可能有一个名为"dont_write_bytecode"的设置可以设置为抑制它.也可以通过传递"-B"选项或设置环境变量"PYTHONDONTWRITEBYTECODE"来设置


Rot*_*eti 8

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

来自 Python 文档:

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

例子

如果您./profile在 Linux 中添加以下行:

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

使用安装实用程序时setup.py,entry_points=您将sys.dont_write_bytecode在启动脚本中进行设置.因此,您不能依赖setuptools生成的"默认"启动脚本.

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

python -B somefile.py
Run Code Online (Sandbox Code Playgroud)

somefile.pyc无论如何都不会生成,但也没有.pyc导入其他文件的文件.

如果你有一些实用程序myutil,你不能改变它,它不会将-B传递给python解释器.只需通过设置环境变量启动它PYTHONDONTWRITEBYTECODE:

PYTHONDONTWRITEBYTECODE=x myutil
Run Code Online (Sandbox Code Playgroud)


alp*_*989 5

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

\n\n

Ipython\xe2\x80\x99 不尊重%env PYTHONDONTWRITEBYTECODE =1ipython解释器中或启动期间~/.ipython/profile-default/startup/00-startup.ipy设置的情况。\n而是在您的~.ipython/profile-default/startup/00-startup.py

\n\n\n\n
import sys\nsys.dont_write_bytecode=True\n
Run Code Online (Sandbox Code Playgroud)\n