python py文件与pyc文件相互转换
本文以Python3.8为例
1、 compileall py文件转换为pyc
1.1、compileall命令行模式
不需要额外安装,python自带模块。
可以利用Python -m的方式在命令行模式下编译py文件。
python -m compileall 文件或路径 可选项
比如要编译当前工作目录下的所有py文件:
python -m compileall .
或者:
python -m compileall .\
比如要编译某个指定目录sub\dir\下的所有py文件:
python -m compileall sub\dir\
如果只编译某一个指定的test.py文件:
python -m compileall test.py
注意命令行模式下,如果不指明文件或路径默认会将sys.path下的所有文件进行编译!sys.path包括了当前工作目录、Python安装目录、Python包目录等。
使用上述编译命令后会在py文件所在的同一级目录下生成一个__pycache__文件夹,在该__pycache__文件夹下会根据py文件名称和Python版本号生成对应的pyc文件,比如test.py文件对应会生成一个__pycache__\test.cpython-38.pyc文件。
下面这个例子编译new文件夹下的py文件,通过tree命令可以看到编译后的文件结构:
E:\juzicode>python -m compileall new
Listing 'new'...
Compiling 'new\\build.py'...
Compiling 'new\\test.py'...E:\juzicode>tree new /f
卷 xyz 的文件夹 PATH 列表
卷序列号为 000000
E:\JUZICODE\NEW
│ build.py
│ test.py
│
└─__pycache__build.cpython-38.pyctest.cpython-38.pyc #生成的pyc文件所在的位置
使用python -m compileall -h可以看到帮助文档和可选项的含义:
-l:不递归编译子文件夹;
-r level:指定编译文件夹的层数,优先级高于-l;level=0表示不进入下一层,levle=1表示进入第一层,level=2表示进入第二层,以此类推。
-f:强制重新编译一次,即使文件的时间戳没有更新,当没有使用-f选项时,如果py文件的时间戳更早于pyc文件,不会触发编译过程;
-x REG:根据REG表示的正则式选择文件编译。
1.2、compileall源码模式
compileall还提供源码方式编译py文件,同样会生成__pycache__文件夹及在该文件夹下的pyc文件。
首先导入compileall模块,使用compileall.compile_file(‘py文件名称’)编译py文件:
import compileall
compileall.compile_file('test.py')-----结果:
Compiling 'test.py'...
另外也可以使用compileall.compile_dir(‘路径名称’)编译某个路径下的py文件:
import compileall
compileall.compile_dir('new')-----结果:
Listing 'new'...
Listing 'new\\mod'...
Compiling 'new\\mod\\mod.py'...
Compiling 'new\\test.py'...
Compiling 'new\\xyz.py'...
还有一个不常用的方法是compileall.compile_path()会编译sys.path路径下的py文件。
2、uncompyle6 pyc转换为py文件
2.1、安装
可以使用uncompyle6将pyc文件转换回py文件,在Python3.8中需要额外安装uncompyle6模块:
pip install uncompyle6
安装之后就会在Python安装目录的scripts文件夹下生成一个uncompyle6.exe的可执行文件:
一般在安装时添加过安装目录到环境变量下,这时就可以直接运行uncompyle6。
2.2、uncompyle6命令行模式
下面这个例子用命令“uncompyle6 test.pyc” 解析test.pyc文件并输出解析后的内容:
E:\juzicode\pyc-2-py>uncompyle6 test.pyc
# uncompyle6 version 3.8.0
# Python bytecode 3.8.0 (3413)
# Decompiled from: Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)]
# Embedded file name: test.py
# Compiled at: 2022-05-01 20:51:57
# Size of source mod 2**32: 60 bytes
import sys
print(sys.version)
# okay decompiling test.pyc
从解析的内容可以看到使用的uncompyle6的版本号、Python的版本号、编译成pyc时的编译时间、源代码的内容等。
上面这种命令方式只是将解析后的内容输出到控制台,如果要将解析结果生成py文件,则可以将打印输出重定向到文件里:
uncompyle6 test.pyc > test.py
这样在当前目录下就生成了一个test.py文件,文件内容和前述例子打印输出内容一致。
另外一种方法是使用-o选项+目标文件路径+pyc文件(可以是多个),在目标文件路径下输出和pyc同名的py文件:
E:\juzicode\pyc-2-py>uncompyle6 -o .\ build.pyc test.pyc
build.pyc --
test.pyc -- decompiled 2 files: 2 okay, 0 failed
# decompiled 2 files: 2 okay, 0 failed
2.3、uncompyle6代码模式
先用open方法创建一个文件实例pf,再使用decompile_file(‘pyc文件’,pf)函数将pyc文件转换为py文件:
import uncompyle6 as uc
pf = open("test.py", "w")
uc.decompile_file("test.pyc", pf)
转换后的文件和用命令行方式内容一样,包含了编译时间、Python版本、源代码等。
python py文件与pyc文件相互转换相关推荐
- Python篇之编译py文件为pyc文件的方法总结
一.前言 一般来说,当我们在发布系统的时候,希望上线的代码是安全可靠的,不希望别人能看到源代码,通常都会先提前编译好,然后进行发布,在python中,编译好的代码格式为 .pyc 文件 常见的pyth ...
- python编译py文件为pyc文件
python py编译pyc方法和运行导入pyc 1.编译文件 编译py文件为pyc文件: import py_compile py_compile.compile('./test.py') 结果会在 ...
- .py文件转.pyc文件
.py文件转.pyc文件 转载自 python提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是py_compile 模块. 将单个python文件转为pyc文件 python -m py ...
- python运行pyc文件_Python pyc文件
什么是pyc文件 pyc 是由py文件经过编译后二进制文件,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python 的虚 拟机来执行的.pyc的内容,是跟pyt ...
- python生成和导入pyc文件
生成pyc文件: import compileall compileall.compile_dir("/file_path") /file_path文件夹包含了所有要生成pyc格式 ...
- python环境打包编译py文件成pyc和pyo
pyc和pyo简介 .pyc 在执行python代码时经常会看到同目录下自动生成同名的pyc文件.这是python源码编译后的字节码,一般会在代码执行时自动生成你代码中引用的py文件的pyc文件.这个 ...
- 什么是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把 ...
- python执行py文件生成pyc_python生成pyc文件
pyc文件是py文件编译后生成的字节码文件(byte code).pyc文件经过python解释器最终会生成机器码运行.所以pyc文件是可以跨平台部署的,类似Java的.class文件.一般py文件改 ...
- Python代码编译,py文件编译为pyc文件
介绍: 编译py文件为pyc,并且移除编译生成的文件夹和编译前的py文件 请见代码库: 点击此处获取一键编译脚本[gitee] 使用说明: 1.将需要编译的项目复制出来,放到compile_dir_a ...
最新文章
- 递归调用(Java)
- spring中type转换框架设计与实现
- 爬虫实战:批量爬取京东内衣图片(自动爬取多页,非一页)
- Fluid 0.6 版本发布:数据感知的Pod调度与数据集自动弹性扩缩容
- 制作WEB在线编辑器-插入HTML标签
- 关于spring boot多张表建立外健的讨论
- 不同磁盘目录共享linux,linux下实现磁盘共享(mount)
- 前端总结·基础篇·CSS(二)视觉
- 惊现飞鸽传书2009
- nodejs实战mysql_node.js实战:手把手教你使用mysql
- Mysql的sql语句基础大全,仅供个人笔记参考,由于创建过程只求速度,所以结构比较乱,请不要打开,如有需要,请自行查阅其他文献
- Struct与Class
- Scala深入浅出实战初级入门经典视频课程
- mybatis + spring + PostgreSQL使用中的问题一例
- 伺服舵机匀加速和匀减速程序控制
- java 验证码不显示,页面没有显示验证码解决办法
- excel出现为了防止数据流失,无法移走非空单元格怎么办
- 无限循环滚动代码阿里巴巴国际站店铺装修代码底图滚动黑色半透明显示效果自定义内容装修代码全屏显示
- 计算机硬盘怎么整理,w7怎么整理磁盘碎片_如何清理win7电脑磁盘碎片
- 面对人工智能,我们应有的态度
热门文章
- 数据分析师必备知识点:置信度与置信区间
- linux汇编伪指令大全,ARM汇编的伪指令(一)
- 环信3.0自定义扩展消息
- 哈希表(散列表)基础知识总结
- 读《把时间当做朋友》
- VxWorks设备驱动开发指南--VxBus And VxBus Device Driver
- 这是C语言结课前(期末考试之前)写给牛晓霞的一封信!
- SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)
- Linux下的FrameBuffer驱动框架
- 【Soul源码阅读】12.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(上)