Python 什么情况下会生成 pyc 文件?

Python什么情况下会生成pyc文件? 作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。 因此总的来说,它具有以下三条特性 源码距离底层更远(根据官方文档的解释。不说,你... 阅读详情

作者:折木奉太郎(经授权转载)

来源:https://www.zhihu.com/question/30296617/answer/112564303

作为 Python 爱好者,需要了解 .py 脚本的基本运行机制及特性:

在很多工作上,Python 的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行 Python 文件程序的时候,Python 解释器将源码转换为字节码,然后再由解释器来执行这些字节码。

因此总的来说,它具有以下三条特性:

  1. 源码距离底层更远(根据官方文档的解释。不说,你们也感觉得到)(。・`ω´・)

  2. 运行时都需要生成字节码,交由虚拟机执行。(你们问我虚拟机在哪儿?!你们也不看看各自都是用什么软件执行的!没错,就是解释器,别和我说是 IDLE 啊。虚拟机具体实现了由 switch-case 语句构成的框架函数 PyEval_EvalFrameEx,刚刚说的字节码就是这货执行的)

  3. 每次执行脚本,虚拟机总要多出加载和链接的流程。(所以呢,相比于编译型语言就有点慢了。这与“有丝分裂间期”一样,准备东西也要花时间啊!)

那么,有人要问了:“不是说,运行时总要生成字节码么!那,字节码都去哪儿了?” 咳咳,别急!容我先说说,虚拟机它是怎么执行脚本的(咕噜咕噜喝杯水...):

  1. 完成模块的加载和链接;

  2. 将源代码翻译为 PyCodeObject 对象(这货就是字节码),并将其写入内存当中(方便 CPU 读取,起到加速程序运行的作用);

  3. 从上述内存空间中读取指令并执行;

  4. 程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将 PyCodeObject 写回硬盘当中(也就是直接复制到 .pyc 或 .pyo 文件中);

  5. 之后若再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。

你看!在我们点击(或输入命令)运行脚本,并悠闲地喝咖啡时,“人家”虚拟机做了这么多的事情。不过,你有没有发现 .pyc 或 .pyo 文件是否生成,是取决于我们如何运行程序的(虽然我们不知道要怎么做(ง •̀_•́)ง )。

同样,有人会吐槽:“哼!为什么不直接生成这些文件,这样来得不是‘更快、更高、更强’!”

其实,虚拟机也是讲究效率的。毕竟对于比较大的项目,要将 PyCodeObject 写回硬盘也是不可避免地要花些时间的,而且它又不知道你是不是也就只执行一次,之后就对刚刚跑完的脚本“弃之不顾”了呢。不过,它其实也有贴心的一面。比如,

  • 若你在命令行直接输入“python path/to/projectDir”(假设projectDir目录含有“__main__.py”文件,以及其他将要调用的模块),那么程序运行结束后便自动为当前目录下所有的脚本生成字节码文件,并保存于本地新文件夹__pycache__当中。(这也有可能是 IDE 写小项目时自动生成 .pyc 文件的原因,不过问题描述略微暧昧。详情参见上面知乎问题板块)

  • 或者是,在命令行输入“python path/to/projectDir/__main__.py”,则生成除__main__.py 外脚本的字节码文件。不过总的来说,上述这两种行为都大大缩短了项目运行前的准备时间(毕竟分工明确的程序,规模应该不会太小,复用率也不会太低。除非吃饱了撑着,搞出这么多事情(Θ皿Θメ))

  • 模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致。若是则直接从该字节码文件读取内容,否则源模块重新导入,并在最后生成同名文件覆盖当前已有的字节码,从而完成内容的更新(详见import.py)。这样,就避免了修改源代码后与本地字节码文件产生冲突(当然,设计者也不会这么傻。╮( ̄▽ ̄")╭)。

若想优化生成字节码,应注意这两点:

  • .pyc 文件是由 .py 文件经过编译后生成的字节码文件,其加载速度相对于之前的 .py 文件有所提高,而且还可以实现源码隐藏,以及一定程度上的反编译。比如, Python3.3 编译生成的 .pyc 文件,Python3.4 就别想着去运行啦!→_→

  • .pyo文件也是优化(注意这两个字,便于后续的理解)编译后的程序(相比于 .pyc 文件更小),也可以提高加载速度。但对于嵌入式系统,它可将所需模块编译成 .pyo 文件以减少容量。

但总的来说,作用上是几乎与原来的 .py 脚本没有区别的,也就是“然并卵 ”(当然,并非毫无作用。比如,我个人觉得用处最大的地方就是防止别人偷看我的代码。_(:з」∠)_毕竟 .py 源文件是直接以源码的形式呈现给大家的)。╮(╯▽╰)╭ 呃...这么说,好像又有点自相矛盾的赶脚。

在所有的 Python 选项中:

  • -O,表示优化生成 .pyo 字节码(这里又有“优化”两个字,得注意啦!)

  • -OO,表示进一步移除 -O 选项生成的字节码文件中的文档字符串(这是在作用效果上解释的,而不是说从 -O 选项得到的文件去除)

  • -m,表示导入并运行指定的模块

对此,我们可以使用如下格式运行 .py 文件来生成 .pyc 文件(以下调用均假设 /path/to目录含有.py 脚本):

python -m py_compile /path/to/需要生成.pyc的脚本.py #若批量处理.py文件
#则替换为/path/to/{需要生成.pyc的脚本1,脚本2,...}.py
#或者/path/to/

其效果等效于如下代码:

import py_compile
py_compile.compile(r'/path/to/需要生成.pyc的脚本.py') #同样也可以是包含.py文件的目录路径
#此处尽可能使用raw字符串,从而避免转义的麻烦。比如,这里不加“r”的话,你就得对斜杠进行转义

py_compile 是 Python 的自带模块,这里面就两个函数(看到这个,我笑了(๑•́ ₃ •̀๑)噗噗)。其下的 py_compile.compile(file[, cfile[, dfile[, doraise]]]) 可将 .py 文件编译生成 .pyc 文件(默认),对应的参数解释如下

  1. file,表示需要生成 .pyc 或 .pyo 文件的源脚本名(字符串);

  2. cfile,表示需要生成 .pyc 或 .pyo 文件的目标脚本名。呃...好像没有区别(>﹏<) ,也就是源脚本-----[巴拉拉赐予你力量!编译!]( * ̄▽ ̄)o ─═≡※:☆----->目标脚本。当然,它默认是以 .pyc 为扩展名的路径名的字符串(呼...好长)。此外,当且仅当所使用的解释器允许编译成 .pyo 文件,才能以“.pyo”结尾。这也就是我上面为什么会在函数功能解释上加上“(默认)”这两个字的原因。

  3. dfile,表示编译出错时,将报错信息中的名字“file”替换为“dfile”。

  4. doraise,设置是否忽略异常。若为 True,则抛出 PyCompileError 异常;否则直接将错误信息写入 sys.stderr(什么!不知道 sys.stderr?!温馨提示:sys.stderr 是 Python 自带的标准错误输出)

(╯' - ')╯︵ ┻━┻ (掀桌子) ┬─┬ ノ( ' - 'ノ) (摆好摆好) (╯°Д°)╯︵ ┻━┻(再TA喵掀一次)

另外,生成 .pyo 文件的格式调用如下:

python -O -m py_compile /path/to/需要生成.pyo的脚本.py

那么,有人要问了:为什么不是像生成.pyc文件那样采用“python -O /path/to/需要生成.pyo的脚本.py”形式的调用?

“忘记”说明这一点了,很多博客以及书籍都像我上面那样解释“-O”选项的作用,但详细来解释的话是:

-O 选项,将 .pyc 文件优化(注意我一直强调的“优化”二字,这里就用到啦!)为 .pyo 文件,而不是将 .py 文件优化编译为 .pyo 文件。(其直接的结果是优化编译后的文件略微小于 .pyc 文件,也就是“减肥”了。现在,大家知道 .pyo 文件为什么小的原因了吧!)

注意: 以上无论是生成 .pyc 还是 .pyo 文件,都将在当前脚本的目录下生成一个含有字节码的文件夹 __pycache__ 。

可能还有人会问,.pyd 文件又是什么鬼(>﹏<)?!(问题真多,精分ing...) 别在意,那只是 Python 的动态链接库。如果要深究,还得扯上 C++ 的知识(长篇大论的,会被喷的啊)。

再啰嗦一句:生成字节码的方法多了去了,不止以上这几种。比如,你们不妨试试将上面命令行调用中的“py_compile”改成“compileall”,而代码行中的“py_compile.compile”改成“compileall.compile_file”或“compileall.compile_dir”,又或者直接使用带有编译功能的 IDE 生成字节码。

再再啰嗦一句:知道 Python 运行机制,并不是我们一般人所必须的(吃瓜群众:“滚!我刚好不容易看完了,你才说?!”)。但是,了解其加速程序运行以及优化代码的设计思想,对于我们在日后构造缓存系统、如何减少不必要的运行时间,以及同步更新工作内容等问题上起到很大的借鉴作用。

若想要了解更多的内容,可以去翻翻官方文档和其它博客:

https://docs.python.org/3.5/using/cmdline.html?highlight=#command-line-and-environment

https://docs.python.org/3.5/library/py_compile.html?highlight=.pyc#module-py_compile

https://docs.python.org/3.5/c-api/code.html?highlight=pycodeobject#code-objects

http://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html

http://www.tuicool.com/articles/Q7Rj6rr

http://developer.51cto.com/art/201002/184914.html

(完)


将python项目打包加密为pyc 项目上线后,为了保护代码,需将其编译为pyc,编译后的Pyc文件别人无法看到源码,脚本里的/home/Dayang-S3是项目名称,根据自己的需求修改就好 立即下载

相关推荐

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string

rocketmq JSONException: not close json text, token : string 问题解决

qq_21067307的博客 5573

python中__pyc__文件的生成和作用

当我们的python文件被编译过,文件之间存在import关系,就会生成一个__pyc__文件夹。 比如我们新建一个工程,里面一共两个py文件。 分别是ttt.py和imp.py ttt.py里面就只有一个方法。 imp.py import了ttt。编译过后,我们会看见多了一个__pyc__文件夹 . imp.py import ttt ttt.sayHello() image.png 内部 image.png 一、存在的意义 主要意义:加快启动速度 原因 Py..

box_kun的博客 926

上证指数30年k线图_金融占星简单解读上证指数30年历史行情

阅读此文需要一定的占星基础知识,本人对于金融知识了解甚少,如有描述错误请包涵指正!影响大众事件发展趋势的都是外行星,即木星-冥王星这5颗,由于时间跨度长达30年,绘制社会行星的K线图工作量太大,所以只以时代行星对这30年行情的简单解读作为分享,在今后的短期分析中会逐渐加入社会行星,甚至在个股分析上还会加入个人行星。那即使只绘制时代行星,所展现出来的信息也无法在一张图上画出来,否则太乱难以分辨,所以...

weixin_39831242的博客 1675

python的.pyc文件

python是解释型语言,在程序执行时会吧源代码编译成字节码形式,并把字节码保存为拓展名为pyc的文件,字节码被发送到PVM上执行。 下一次执行程序时如果没有修改过源代码的话,就会直接加载.pyc文件并且跳过编译步骤,这样就能加速启动. 通常情况下只有把文件当做模块来使用时才会产生pyc文件. 没有生成pyc文件时,会在内存中产生字节码并在程序结束时丢弃。 python会自动检查源文件和字节码文件...

qq_41374768的博客 229

工业数据采集实战:用open62541库读写PLC的OPC UA节点(避坑指南)

本文详细介绍了如何使用open62541库实现工业PLC的OPC UA节点数据采集,涵盖环境搭建、节点读写优化及生产环境故障排查。通过订阅模式和多节点读写技术,显著提升数据采集效率与稳定性,适用于智能制造和工业物联网场景。

weixin_30598225的博客 399

APM水下机器人实战:从零搭建高精度自主航行系统

本文详细介绍了如何基于开源APM飞控及其水下分支ArduSub,从零搭建高精度自主水下航行器。核心在于集成双天线RTK模块实现厘米级定位与精确航向,并配合MAVROS与ROS构建自主控制系统。文章涵盖了硬件选型、软件配置、自主逻辑开发及水池调试的全流程实战经验,为水下机器人爱好者与研究者提供了一套完整的自主航行系统解决方案。

app77的博客 512

Python?Python!(python是解释型还是编译型)

前言:一个人,闲着没事,就喜欢胡思乱想,这一想就想出了很多东西,因此就充满了疑问,这又是一个百度的下午。看了很多篇博文,思路始终很是凌乱,不知道怎么写,有些内容看完就忘记了,但是我还是要进自己最大的努力去把下午看过的内容进行总结,这样也不枉费这一下午百度的流量。如果您和我一样,对python的运行有一些疑惑那么请您仔细阅读这篇文章,我写了很久,虽然我不能保证看完您就对python底层的运行机制彻...

老司机开代码的博客 9573

Veritas NetBackup 10.1 Windows安装指南:从账户配置到完整部署

本文详细介绍了Veritas NetBackup 10.1在Windows系统上的完整安装流程,从账户配置到部署验证。重点讲解了创建专用服务账户、安装组件选择、许可证输入等关键步骤,并提供了常见问题排查和进阶配置建议,帮助用户顺利完成企业级备份解决方案的部署。

weixin_26765287的博客 453

Python篇之编译py文件为pyc文件的方法总结

一般来说,当我们在发布系统的时候,希望上线的代码是安全可靠的,不希望别人能看到源代码,通常都会先提前编译好,然后进行发布,在python中,编译好的代码格式为 .pyc 文件。1、python内置的py_compile模块可以把py文件编译为pyc文件或pyo文件;.py  --python的源代码文件,程序内容可以用文本编辑器直接打开,代码可视。.pyc  – .py文件经过编译后产生的字节码文件,是二进制文件。.pyo  – .py文件经过优化后的执行文件。当maxlevels = 0,不需要递归。

小橙子的笔记屋 9082

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1031

阻抗控制器实现机器人关节运动控制

本文先对做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章如:PID反馈控制器、前馈控制器、前馈+反馈控制器等等如:机械臂模型(几何解算)控制器、小车底盘运动学模型(几何解算)的控制器、四足机器人模型(预测迭代)的控制器等等如:微分平坦(无人机的轨迹跟随)等等如:MPC优化控制算法如:线性二次调节器(LQR)是基于模型的控制器,使用车辆状态来使误差最小化,Apollo使用LQR进行横向控制。横向控制包含四个组件:横向误差、横向误差的变化率、朝向误差和朝向的变化率。

qq_35635374的博客 364

Python之pyc文件作用及生成方法

所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。.pyc文件是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高,而且还可以实现源码隐藏,以及一定程度上的反编译。生成的pyc在__pycache__目录下,但是会带版本号,这需要自己去删除,删除原py文件,不用修改源码的import,会自动去调用pyc文件。

天涯路的专栏 2576

华为OD技术面八股文_C++_01

汇总华为OD技术面C++方向八股文真题,并提供详细解答。

qq_45776114的博客 1885

python运行pyc文件_Python什么情况下会生成pyc文件?

作为Python爱好者,需要了解.py脚本的基本运行机制及特性:在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。因此总的来说,它具有以下三条特性源码距离底层更远(根据官方文档的解释。不说,你们也感觉...

weixin_39849153的博客 337

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

python程序编译之后、找不到生成的pyc文件_Python什么情况下会生成pyc文件?

作为Python爱好者,需要了解.py脚本的基本运行机制及特性:在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。因此总的来说,它具有以下三条特性源码距离底层更远(根据官方文档的解释。不说,你们也感觉...

weixin_39609622的博客 1112

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

py文件运行_Python什么情况下会生成 pyc文件?通过pyc文件了解Python运行原理

由于最近一位同学在做分布式计算时,部分模块只把 pyc文件拷贝部署至远程计算节点,导致主节点程序更新后,计算节点抛出了错误异常,于是有了这篇文章...示例如下,有两个py模块,testops.py 与 testops_imported.py模块。我们先来看 testops.py模块。testops.py再来看一下 testops_imported.py 模块,该模块中导入了 testops模块,如...

weixin_39836876的博客 461

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

.pyc文件还原.py文件_Python什么情况下会生成pyc文件?

作为Python爱好者,需要了解.py脚本的基本运行机制及特性:在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。因此总的来说,它具有以下三条特性源码距离底层更远(根据官方文档的解释。不说,...

weixin_39610366的博客 377

android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?

作者:折木奉太郎(经授权转载)来源:https://www.zhihu.com/question/30296617/answer/112564303作为 Python 爱好者,需要了解 .py 脚本的基本运行机制及特性:在很多工作上,Python 的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行 Python...

weixin_39999586的博客 194

Python中的pyc文件是作什么用的?(61)

有了模块的字节码文件后,下次程序运行时,如果在上次保存字节码之没有修改过源码,Python将会加载pyc文件并跳过编译这个步骤。在磁盘上建立一个文件夹pyc,在该文件夹下创建两个Python文件,一个模块module.py,一个是test.py。pyc文件的作用是加速程序的执行,import模块时,解释器会先编译该模块,生成pyc文件。可以的,把test.py放入__pycache__,pyc文件改名为module.pyc。py源码文件如果没有加入代码混淆的话,那么生成的pyc文件,是可以反编译出源码的。

parasoft的专栏 679

python处理can协议文件_二、如何解决:python:Can't reopen .pyc file

如何解决:python:Can't reopen .pyc filepyc文件是python在编译过程中出现的主要中间过程文件。pyc文件以二进制形式存在,可以由python虚拟机直接执行的程序。通过生成.pyc文件可以提高程序运行的速度,编译过的.pyc程序代码也相当于转换了源代码,提高源码加密性。当然了,反编译还是存在的,但是还是可以一定程度上对程序进行包装,反编译程序也费时费力,工作量大。我...

weixin_42510962的博客 577

Python运行执行模式

转自:http://my.oschina.net/flynewton/blog/12489 平时download下来的一些python工程,执行后都会有.pyc文件产生,所以一直都以为执行.py文件后都会产生.pyc文件,今天试了把,发现不是那么一回事情,查资料并研究后发现: 1.Python的运行执行模式为:将录入的源代码转换为字节码,之后字节码在Python虚拟机中运行(代码自动被编译,然

Hello World! 948
上一篇: Linux中实用但很小众的11个炫酷终端命令
下一篇: 一些资料合集:关于AI和大数据方面
Wang_AI
博客等级 码龄12年 990粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值