如何避免.pyc文件?

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


从“Python 2.6的新增功能 - 解释器更改”开始:

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

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


import sys

sys.dont_write_bytecode = True

实际上有一种方法可以在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]可用于导入。 动态模块(.pyd,.so)的ZIP导入是不允许的。 请注意,如果存档文件仅包含.py文件,则Python不会尝试通过添加相应的.pyc或.pyo文件来修改存档文件,这意味着如果ZIP存档文件不包含.pyc文件,则导入可能会很慢。

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

如果你正在为UNIX编译这个脚本,你也可以考虑使用这个配方来打包你的脚本:unix zip可执行文件,但是请注意,如果你打算使用stdin或者从sys.args中读取任何东西,你可能需要调整它(它可以是没有太多的麻烦)。

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

链接地址: http://www.djcxy.com/p/24139.html

上一篇: How to avoid .pyc files?

下一篇: Check if file exists and continue else exit in Bash