背景知识

  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. 云计算之路-试用Azure:Azure内置的负载均衡是四层的

    当初迁移至阿里云遇到的第一个问题是在程序中通过Request.UserHostAddress得到的是负载均衡(SLB)的内网IP,而不是用户的真实IP.真实IP存储在服务器变量HTTP_X_Forwa ...

  2. Qracle、Sql server 、mysql查询练习题

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  3. 常见的web前端性能优化

    一. 语义化HTML:语义化HTML的好处是可以使代码简洁清晰.支持不同设备.利于搜索引擎.便于团队开发: 减少DOM节点:加速页面渲染: 给图片加上正确的宽高值:这可以减少页面重绘,同时防止图片缩放 ...

  4. Activity生命周期以及启动模式对生命周期的影响

    前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...

  5. LightOj 1221 - Travel Company(spfa判负环)

    1221 - Travel Company PDF (English) Statistics problem=1221" style="color:rgb(79,107,114)& ...

  6. Struts 第一个Hello页面

    在工程目录的src下新建 struts.xml   <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...

  7. tar 命令详解 / xz 命令

    ]# tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的 ...

  8. 特殊文件权限(setuid、setgid 和 Sticky 位)

    可执行文件和公共目录可以使用三种特殊类型的权限:setuid.setgid 和 sticky 位.设置这些权限之后,运行可执行文件的任何用户都应采用该可执行文件属主(或组)的 ID. setuid 权 ...

  9. Arrays.sort()

    今天在做一个按更新时间搜寻出某个目录里面的全部文件,因为自己写算法比較花费时间,干脆就用j2se提供的类Arrays提供的sort()方法,这样就比較省力.对于基本数据类型仅仅要Arrays.sort ...

  10. Nuget使用规范