一、命令生成 pyc 文件

  • *.py:源码文件,由 Python 程序解释。
  • *.pyc:源码经编译后生成的二进制字节码(Bytecode)文件。
  • *.pyo:优化编译后的程序,也是二进制字节码文件。

虚拟机怎么执行py脚本:

  • 完成模块的加载和链接;
  • 将源代码翻译为PyCodeObject对象(这就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用);
  • 从上述内存空间中读取指令并执行;
  • 程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将PyCodeObject写回硬盘当中(也就是直接复制到.pyc或.pyo文件中);
  • 之后若再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。

Python 在解释源程序时分为两步:

  • 第一步:将源码转为字节码
  • 第二步:将字节码转换为机器码

pyc 文件是由 Python 解释器将 模块的源码 转换为 字节码,下次运行程序的时候,就可以跳过 从源码到字节码 的过程,直接加载 pyc 文件。
(pyc,py代表pychon,c 是 compiled的含义,pyc即编译过的python文件 )

二、命令生成 pyc 文件

1.单个生成pyc文件:

1.1命令方式---生成pyc文件:

python -m py_compile test.py

或者

python -m compileall test.py 

把单个.py文件编译为字节码文件

1.2 脚本方式---生成pyc文件:

import py_compile
if __name__=='__main__':
    py_compile.compile('/path/to/test.py')#/path/to/代表脚本所在目录
其下的py_compile.compile(file[, cfile[, dfile[, doraise]]])可将.py文件编译生成.pyc文件(默认),对应的参数解释如下
  1. file,表示需要生成.pyc或.pyo文件的源脚本名(字符串);
  2. cfile,表示需要生成.pyc或.pyo文件的目标脚本名。此外,当且仅当所使用的解释器允许编译成.pyo文件,才能以“.pyo”结尾。这也就是为什么会在函数功能解释上加上“(默认)”这两个字的原因。
  3. dfile,表示编译出错时,将报错信息中的名字“file”替换为“dfile”
  4. doraise设置是否忽略异常。若为True,则抛出PyCompileError异常;否则直接将错误信息写入sys.stderr(什么!不知道sys.stderr?!温馨提示:sys.stderr是Python自带的标准错误输出

二. 批量生成pyc文件:

1 命令方式---生成pyc文件:

python -m py_compile /path/to/          #批量生成字节码文件,/path/to/是包含.py文件名的路径

  或者 

python -m compileall /path/to/
#批量生成字节码文件,/path/to/是包含.py文件名的路径

2 脚本方式---生成pyc文件

import compileall
if __name__=='__main__':
compileall.compile_dir('/path/to')

三. 单个生成pyo文件

  1 命令方式---生成pyo文件:

python -O -m py_compile test.py

  或者

python -O -m compileall test.py

四. 批量生成pyo文件:

  1 命令方式---生成pyo文件:

python -O -m py_compile /path/to/

或者

python -O -m compileall /path/to/

或者

python -OO -m py_compile file.py
python -OO -m py_compile /path/to/
python -OO -m compileall file.py
python -OO -m compileall /path/to/

note:

  1.   -m参数相当于import,-m py_compile 相当于import py_compile,也即把后边跟随的库模块当做脚本运行。这样生成的字节码文件后缀名为.pyc文件。
  2.   -O参数表明要生成更加紧凑的优化后的字节码, 这样生成的字节码文件后缀名为.pyo文件。
  3.   -OO会进一步移除-O选项生成的优化后的字节码文件中的文档字符串,生成的文件后缀名仍然为.pyo文件。
  4. pyo文件也是优化编译后的程序(相比于.pyc文件更小),也可以提高加载速度。但对于嵌入式系统,它可将所需模块编译成.pyo文件以减少容量
  5.   注意不同版本编译后的pyc文件是不同的,比如3.4编译的pyc文件在3.3版本的python是无法执行的。

五、生成_pyc__文件夹

当我们的python文件被编译过,文件之间存在import关系,就会生成一个__pyc__文件夹。

  • 若你在命令行直接输入“python path/to/projectDir”(假设projectDir目录含有“__main__.py”文件,以及其他将要调用的模块),那么程序运行结束后便自动为当前目录下所有的脚本生成字节码文件,并保存于本地新文件夹__pycache__当中
  • 或者是,在命令行输入“python path/to/projectDir/__main__.py”,则生成除__main__.py外脚本的字节码文件。不过总的来说,上述这两种行为都大大缩短了项目运行前的准备时间。
  • 模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致。若是则直接从该字节码文件读取内容,否则源模块重新导入,并在最后生成同名文件覆盖当前已有的字节码,从而完成内容的更新(详见import.py)。这样,就避免了修改源代码后与本地字节码文件产生冲突。

python中的pyc和pyo文件和__pyc__文件夹的更多相关文章

  1. Python中使用第三方库xlrd来写入Excel文件示例

    Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...

  2. Python是解释性语言吗? 直到看到有 python py、pyc、pyo、pyd 文件

    py是源文件,pyc是源文件编译后的文件,pyo是源文件优化编译后的文件,pyd是其他语言写的python库 1. Python是一门解释型语言? Python是一门解释性语言,我就这样一直相信下去, ...

  3. python中的PYC文件是什么?

    1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...

  4. Python文件格式 .py .pyc .pyw .pyo .pyd的主要区别

    Python是一种面向对象.解释型计算机程序设计语言.Python 语法简洁.清晰,具有丰富和强大的类库.Python源代码遵循 GPL (GNU General Public License) 协议 ...

  5. Python中生成(写入数据到)Excel文件

      转自http://www.crifan.com/export_data_to_excel_file_in_python/ 在Python中,如何将数据,导出为Excel,即把数据写入到新生成的ex ...

  6. python学习之pyc,pyo,pyd文件

    pyc:二进制文件,python文件经过编译器编译之后的文件.可以提高文件加载速度. pyo:二进制文件,优化编译后的文件.可以通过`python -O file.py`生成. pyd:python的 ...

  7. Python中使用with语句同时打开多个文件

    下午小伙伴问了一个有趣的问题, 怎么用 Python 的 with 语句同时打开多个文件? 首先, Python 本身是支持同时在 with 中打开多个文件的 with open('a.txt', ' ...

  8. 在Python中使用moviepy进行视频剪辑时输出文件报错 ‘NoneType‘ object has no attribute ‘stdout‘问题

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 movipy输出文件时报错 'NoneType' ...

  9. py, pyc, pyw, pyo, pyd 及发布程序时的选择 Compiled Python File (.pyc)

    Python 程序扩展名(py, pyc, pyw, pyo, pyd)及发布程序时的选择 - 司开星的专栏 - CSDN博客 https://blog.csdn.net/chroming/artic ...

随机推荐

  1. java核心技术(第四章)对象与类

    4.1 面向对象程序设计概述 每个对象包含对用户公开的特定功能部分和隐藏的实现部分. 4.1.1类 由类构造对象的过程称为创建类的实例. 封装(数据隐藏)是与对象有关的.从形式上看,封装不过是将数据和 ...

  2. 《你必须知道的495个C语言问题》读书笔记之第1-2章:声明和初始化

    1. C标准中并没有精确定义数值类型的大小,但作了以下约束: (1) char类型可以存放小于等于127的值: (2) short int和int可以存放小于等于32767的值: (3) long i ...

  3. PTA(Advanced Level)1050.String Subtraction

    Given two strings S1 and S2, S=S1−S2 is defined to be the remaining string after taking all the char ...

  4. 【51nod】2589 快速讨伐

    51nod 2589 快速讨伐 又是一道倒着推改变世界的题... 从后往前考虑,设\(dp[i][j]\)表示还有\(i\)个1和\(j\)个\(2\)没有填,那么填一个1的话直接转移过来 \(dp[ ...

  5. unittest参数化(paramunittest)

    前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例前面讲数据驱动的时候,用ddt可以解决多组数据传入,自动生成多个测试用例.本篇继续介绍另 ...

  6. 【USB】struct usb_device_id 结构体详解

    struct usb_device_id { /* which fields to match against? */ __u16 match_flags; //说明使用哪种匹配方式 /* Used ...

  7. 植物大战僵尸:查找植物叠加种植CALL

    实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物. 我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间 ...

  8. Spring实战(五)Spring中条件化地创建bean

    1.@Conditional 为生成bean设置条件 Spring 4中引入了一个新的注解---@Conditional,它用在有@Bean的方法上. 如果给定条件计算结果为true,Spring会创 ...

  9. hdu 3500 还是搜索

    这道题目由于每走一步的时候毛毛球是可以变换的 换言之 主体不唯一 所以这里搜索的设计有变化 再就是几个回溯的过程要注意.,.  小心使得万年船 #include <iostream> #i ...

  10. 10-MySQlL DBA笔记-基础知识

    第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...