好记性不如烂笔头,看到Python Command-Line Options中有关字节码的生成,记录起来。

Python的字节码文件有2种,文件后缀名分别是.pyc和.pyo,前者是普通的字节码, 后者是经过优化的字节码(速度稍快点,但可能加载稍慢点)。

先说什么是字节码文件(bytecode)?

会写Java Hello World的一定知道什么是bytecode了,简单的说它就是一个从source code编译而来的中间文件(用于不同操作系统平台的解释器执行)。 比如,J说日语,C说中文,沟通起来不畅通,请一个翻译,把J和C的语言都翻译成英语,这个英语就可以理解成bytecode,一种中间语言。

bytecode的好处就是加载快,而且可以跨平台,同样一份bytecode,只要有操作系统平台上有相应的Python解释器,就可以执行(而不需要source code)。不同版本的Python编译的bytecode是不兼容的,Python 2.6编译的bytecode拿到Python 2.7上去执行就不行了。

什么时候会生成bytecode?

Python解释器一般会自动把.py文件转换成bytecode,然后再执行它。当你第一次把.py文件当作module导入,或者对应的.py文件比.pyc文件的修改时间还要新时,Python解释器都会再从source code生成相应的新bytecode。这样当你下次再次运行程序时,就会直接从bytecode运行,从而节省便宜时间。

这里需要注意,有些情况bytecode并不会生成。遇到目录写权限的问题时。(比如你编写代码和运行代码使用的具有不同权限的用户角色,Linux上很常见)

运行一个script并不会被当成是import操作,所以可能也不会生成bytecode。(比如:你有个一个a.py的文件,其中在a.py里,你import了b.py,那么运行python a.py后,会生成b.pyc,而不会生成a.pyc)

怎么手动生成bytecode呢?

有时候需要手动的生成bytecode,可以利用下面几种方法:

1. 利用py_compile模块import py_compile

py_compile.compile('a.py')

2. 利用compileall模块import compileall

compileall.compile_file('a.py')

# compileall.compile_dir('.', maxlevels=0) 编译当前目录所有.py文件,需要指定maxlevels=0,否则默认要扫描10层子目录

3. 利用python命令行python -m py_compile a.py # 或 python -m py_compile *.py

python -m compileall a.py # 或 python -m compileall *.py

python -O -m py_compile a.py # 如果跟上 -O 选项以后,会生成 a.pyo

python -O -m compileall a.py # 同上

如果漏掉了compileall的参数(比如:python -m compileall),那么会将sys.path中source code生成相应的bytecode

有趣的Python命令行,直接执行代码:python -c "import sys

print 'hello command line'

for i in range(2):

print i, len(sys.argv)

"

再看一个有趣的Python命令行(sys.argv[0]是-c,sys.argv[1:]分别是 x y z 123)python -c "import sys

for i in sys.argv:

print i

" x y z 123

That's it!

python字节码文件后缀_如何生成Python的字节码文件相关推荐

  1. python玩加件大师_如何聘请Python开发人员并确定真正的大师

    python玩加件大师 "The joy of coding is in seeing a short, concise, readable, and small amount of cle ...

  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  3. 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )

    文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...

  4. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  5. JVM 字节码文件与类加载

    文章目录 前端编译器与后端编译器 解释执行和 JIT&AOT "类"的生命周期 字节码文件的读取解析 "类"的生命周期 加载阶段 链接阶段 初始化阶段 ...

  6. 字节码文件魔数0xCAFEBABE

    字节码文件魔数0xCAFEBABE 每一个java字节码文件(.class)都是以相同的4字节内容开始的--十六进制的CAFEBABE. 咖啡宝贝-因缺思厅... public class Hello ...

  7. python tab和空格混用_我的 Python 编码规范

    python 文件的组成 为了便于描述,先上一个 demo #!/usr/bin/env python# -*- coding: utf-8 -*-"""通常这里是关于本 ...

  8. java中计算一个文件的总字节数_【JVM故事】一个Java字节码文件的诞生记

    作者:李新杰·转自微:信公众号"编程新说" 万字长文,完全虚构.(12000字) (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李 ...

  9. php编译成二进制文件_JVM字节码文件概述

    字节码文件概述 字节码文件的跨平台性 Java语言:跨平台的语言 当Java源代码成功编译字节码后,如果想在不同的平台上面运行,则无需再次编译 这个优势目前来说已经不再吸引人,因为Python.PHP ...

最新文章

  1. C#.NET 上传图片时怎样限制文件格式
  2. 规格表管理之删除规格表数据
  3. django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
  4. 检查企业的销售和分销结构
  5. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
  6. 【字符串系列】字符串匹配中的位并行算法
  7. opengl编程从入门到精通-hello,window
  8. 2016年第6本:简约至上--交互式设计四策略
  9. 用NGINX做负载均衡,keepalived高可用
  10. 【Python】Python库之Web信息提取
  11. Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
  12. 深度学习与 Spark 和 TensorFlow
  13. [转]RamDisk导致远程桌面客户端无法启动问题
  14. 习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分)
  15. mysql的驱动connect放在哪里_十年测试解析:ddt结合excel,csv,mysql实现自动化测试数据驱动...
  16. 如果计算机正执行屏幕保护程序 当用户,计算机一级考试参考试题(含答案)篇节一.doc...
  17. 某公司电子商务网站策划方案
  18. 收款码三合一制作微信小程序源码下载多模板选择
  19. 洛谷P3717探测器解题报告
  20. EXCEL工作表保护密码忘记,撤消工作表保护

热门文章

  1. matlab求系统根轨迹代码_广州数控GSK RH06六轴焊接机器人的轨迹规划
  2. Android超级管理员,实现一键锁屏等等
  3. 个人博客搭建-Hexo(gitee篇)
  4. dataFrame的多条件筛选
  5. 微信小程序服务器文件下载及解压
  6. 【水利物联网】雨污水泵站监控系统方案
  7. 用python实现NMF降维
  8. Android温控服务,温控拜拜(com.an.killthermal) - 0.2.9b1 - 应用 - 酷安
  9. PHP 微信名片生成
  10. java将运算符号替换成_java基础——day02-1 数据类型转换与算数运算符