背景知识

  1. pyc文件: .pyc 是一种二进制文件,是由 .py 文件经过编译后,生成一种byte code文件。 .py 文件变成 .pyc 文件后,加载的速度有所提高,而且 .pyc 是一种跨平台的字节码,是由python的虚拟机来执行的,这个类似于JAVA或者.NET的虚拟机的概念。 .pyc 的内容是跟python的版本相关的,不同版本编译后的 .pyc 文件是不同的,2.5编译的 .pyc 文件对于2.4版本的python是无法执行的。
  2. pyo文件: .pyo 是优化编译后的程序  python -O 源文件 即可将源程序编译为 .pyo 文件。
  3. pyd文件: .pyd 是python的动态链接库。

为什么要编译Python文件?

通常Python代码是不需要编译就可以运行的,但Python其实也是有编译的过程的,与Java和C#一样Python只能执行字节码,Python只是将编译过程隐藏起来了。将Python文件编译为 .pyc 或 .pyo 文件有两个目的:

  1. 由于 .py 文件是可以直接看到源码的,所以如果是开发商业软件的话就需要将 .py 文件编译为看不到源代码的 .pyc 字节码文件后再发布出去;
  2. 将 .py 文件编译为 .pyc 或 .pyo 文件可以提高Python程序的加载速度,而且 .pyc 是一种跨平台的字节码,由python的虚拟机来执行;

python的编译过程

  当我们通过下面的命令来运行一个Python程序时:(Linux中)

Python test.py# test.py中的内容
# --------------------------------------------------------
#!/usr/bin/env python
import mymodule
mymodule.say("hello")

Python解释器其实并不一定会读入 mymodule.py 文件,它会尝试读取 mymodule.pyc 文件或者 mymodule.pyo 文件。如果都失败了,或者 mymodule.py 文件比 mymodule.pyc/mymodule.pyo 新,才转而读入 mymodule.py 文件。Python只懂得解释执行字节码,所以 mymodule.py 文件读入后第一件事就是先进行编译。编译的结果会被尝试保存到 mymodule.pyc 文件中。Python的编译实际上主要是进行文法分析,生成一个抽象语法树,然后转储成字节码形式。这一点与Java有些相似,因为它们都生成字节码。

编译Python文件的方法(Linux)

  编译 .py 文件有以下几种方式,所有这些方式都是使用了 py_compile 模块的 compile() 方法。同时我们可以使用 compileall 模块中的 compile_dir() 来编译某个文件夹下面所有的 .py 文件,以及可以使用 compile_path 来依次编译 sys.path 指定路径下的 .py 文件。如果看过 compileall 模块的源码我们可以知道 compileall 编译 .py 文件其实还是调用了 py_compile 的 compile() 方法。

  在Linux环境下,可以通过写一个bash脚本编译 .py 文件,也可以直接通过命令行来编译。(这里仅介绍通过命令行来编译的方法):

1. 生成单个的 .pyc  or  .pyo 文件

 # 编译成pyc文件# ------------------------------------------------------python -m py_compile $filename    # 其中,$filename是要编译的python源码文件名# 编译成pyo文件# -------------------------------------------------------python -O -m py_compile $filename# 或者
1python -OO -m py_compile $filename
1
1# 其中, + -O选项表示优化产生的字节码,优化程度由PYTHONOPTIMIZE(environment)的值来决定。 + -OO选项表示在-O优化的基础上移除所有的doc-strings(文档文本)。

2. 批量生成 .pyc 文件

  使用compileall模块可以批量编译整个目录下的Python源码文件。

# 函数定义
compileall.compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, quiet=False, legacy=False, optimize=-1)# 用法:
python -m compileall $dir

或者可以编写脚本来实现:

import compileall
compileall.compile_dir('$dir')# 其中,$dir 为Python源代码所在的目录。

python文件的编译相关推荐

  1. Python文件用pyinstaller打包成.exe文件后如何获取Python源码(Python文件反编译)

    此文章自己做个学习记录,也希望对跟我有一样困扰的同学一些帮助! 使用到的工具下载链接我都已经附上,点击下面蓝色字体可直接下载: 1.pyinstxtractor.py 2.wxMEDIT 3.在线编译 ...

  2. Python文件反编译,还原代码(xxd、uncompyle6)

    这里有难度的就是如何复制文件的完整内容,如果能直接下载既下载,否则就要用方法完整拷贝内容 首先复制文件的十六进制的内容 xxd命令转换二进制文件为十六进制文件 xxd .configuration.c ...

  3. python文件编译_编译Python文件

    编译Python文件 一.编译Python文件 为了提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度.python解释器会在__pycache__目录中下缓存每个模块编译后的版本,格式 ...

  4. python文件的两种编译方法

    有时候,需要对python程序项目进行打包,即仅打包python文件编译后的pyc文件,就需要对python文件进行编译. 编译方法有两种: 1.写一个python简本,对所需编译的文件进行编译.(针 ...

  5. 什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件

    文章目录 1 什么是pyc文件 1.1 什么是pyc文件 1.2 pyc文件是怎么生成的,有什么好处 2 把python的py文件编译成pyc文件 2.1 使用python内置库py_compile把 ...

  6. 《跟着小吴哥学python》之 09 python中的编译与反编译

    pyc是由py文件经过编译后,生成的一种跨平台的字节码文件: 加载的速度有所提高,而且pyc是由python的虚拟机来执行的. pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是 ...

  7. 4种Python文件或者文本加密的方式

    需要注意的是,编译成pyc或者pyo文件后需要将命名改成与源Python命名一致,将其放在源目录下,虽然其他python文件调用pyd时显示不能检测到该模块,但实际上可以运行. 由于pyc的编译收到p ...

  8. python文件编译_我算是白学Python了,现在才知道原来Python是可以编译的

    斌哥说 大家好,我是斌哥. 一说起Python,可能开发者第一时间想到的就是:"Python是一门能快速开发的解释型语言". 没错,Python确实是一门解释型的语言,而对比Jav ...

  9. 模块的四种形式 模块的调用 循环导入问题 模块的搜索路径 py文件的两种用途 编译python文件 包...

    目录 模块的四种形式 什么是模块 模块的四种形式 自定义模块 第三方模块 内置模块 包 使用模块的好处 模块的调用 循环导入问题 模块的搜索路径 py文件的两种用途 编译python文件 包 什么是包 ...

最新文章

  1. [转]为什么我要用 Node.js? 案例逐一介绍
  2. 服务器虚拟化的毕业设计,基于Vmware的服务器虚拟化管理毕业论文.doc
  3. 程序员的灯下黑:重知识轻技术(转)
  4. 法拉第未来:投资者声明中存在不一致之处 贾跃亭降薪
  5. mysql c api简单连接池
  6. oracle tcp 上限,操作系统用户最大进程数限制maxuproc
  7. K8S 使用 SideCar 模式部署 Filebeat 收集容器日志
  8. 汇编语言程序设计基础知识
  9. JS(获取浏览器高度)
  10. EXCEL数组公式(3)---数组公式的基础应用,理解数组公式
  11. css中自适应字体问题等
  12. BBU与RRU、RRH
  13. google之admob
  14. Nginx反向代理+PHP服务器搭建
  15. MediaPlayer的消息机制分析
  16. 软件评测师-15.信息安全知识与安全测试
  17. 浙江省中小学信息技术课 9 月换新教材,大数据人工智能占 80%
  18. WinSockAPI
  19. 什么是AJAX的同步异步?
  20. 计算机网络————Wireshark 实验

热门文章

  1. 区块链100讲:区块链中的随机数
  2. 为MyEclipse加入自己定义凝视
  3. Spring 框架的AOP之注解的方式
  4. hdu1285 拓扑排序+优先队列
  5. Eslint中no-undef的检查报错
  6. 使用soapUI代替WSDL2JAVA生成cxf HTTPS 客户端调用代码
  7. Activiti工作流实战-2
  8. 【Swift】UITableViewCell 中 TTTAttributedLabel 超链接无法点击的问题
  9. 手握6亿把钥匙 能否打开“智能家居”的大门?
  10. C++ 容器vector的范例学习