背景知识

  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
# 或者
python -OO -m py_compile $filename # 其中, + -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文件

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

  2. Python的字节编译

    1.什么是Python的.pyc文件 在python中 .pyc文件是指以.pyc为后缀名的这一类文件,在我们的python的安装目录里,找到模块所在的目录Lib会看到很多以.py结尾的模块文件,与之 ...

  3. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  4. 编译Python文件(了解)

    目录 编译Python文件(了解) 批量生成.pyc文件(了解) 编译Python文件(了解) 为了提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度.python解释器会在__pyca ...

  5. Python学习笔记(二)-Python文件类型及编程模式

    Python环境搭建:linux,Windows... Linux下:[root@localhost StudyPython]# python #进入交互模式Python 2.7.11 (defaul ...

  6. 『Python』VS2015编译源码注意事项

    一.2.5.6版本源码编译 解压 Python-2.5.6.tgz 进入 Pcbuild8 文件夹,使用 vs 2013 打开 pybuild.sln (vs 解决方案),进入 vs2015IDE 环 ...

  7. 5、Python文件类型

    Python文件类型 源代码 Python源代码的文件以"py"为扩展名,由Python程序解释,不需要编译 字节代码 Python源文件经编译后生成的扩展名为"pyc& ...

  8. Python自动化运维开发实战 三、python文件类型

    导语: python常用的有3种文件类型 1. 源代码 py 2. 字节代码 pyc 3. 优化代码 pyo 源代码: python源代码的文件以”py"为扩展名,由python程序解释,不 ...

  9. 如何利用pyCharm编写和运行python文件

    在安装python环境后,通常可以利用IDE pyCharm来编译我们的python文件.创建一个python文件夹,用pyCharm打开文件夹,在文件夹中新建一个python文件demo.py 也许 ...

随机推荐

  1. vue - webpack.dev.conf.js for FriendlyErrorsPlugin

    描述:webpack网页端友好的报错信息就来自它 官网:https://www.npmjs.com/package/friendly-errors-webpack-plugin new Friendl ...

  2. Activity生命周期以及启动模式对生命周期的影响(二)

    前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...

  3. Firefly 其他博客

    http://www.cnblogs.com/9miaoshetuan/tag/Firefly/ http://www.cnblogs.com/9miaoshetuan/p/3853124.html ...

  4. RAC环境下的堵塞(blocking blocked)

    RAC环境下的堵塞不同于单实例情形,由于我们须要考虑到位于不同实例的session.也就是说之前查询的v$session,v$lock对应的应变化为全局范围来查找.本文提供了2个查询脚本,并给出实例演 ...

  5. [Exception Spring 1] - Attribute value must not be null

    java.lang.IllegalArgumentException: Attribute value must not be null at org.springframework.util.Ass ...

  6. JMX 学习

    http://blog.csdn.net/qiao000_000/article/category/763467

  7. ASP.NET MVC 简单的分页思想与实现

    首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名为JohnConnor.Web 对创建过程或Razor不太了解的看官,请移步 ASP.NET MVC ...

  8. SICP 1.23-1.26体会

    1.23 代码修改非常easy, 关键是时间. 电脑上算了一下. 100000000下面全是0. 開始还以为代码写错了. 最后没办法, 用1e10 1e11来计算. 发现比 1e11 1e12快1.2 ...

  9. C# 中字符串string和字节数组byte[]的转换

    string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转string: stri ...

  10. php.ini配置与中国间隔12小时间设置方法

    打开php.ini 配置文件找到date.timezone把=号后面的参数改成这个date.timezone = Etc/GMT+4即可,这样与中国的时间误差即能达到12小时