前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >隐藏源码细节:Python脚本编译pyc文件

隐藏源码细节:Python脚本编译pyc文件

作者头像
用户8949263
发布2023-01-09 19:24:42
1.9K0
发布2023-01-09 19:24:42
举报

1 简介

Python已经成为耳熟能详的编程语言,得益于其友好、简洁、万物皆对象的特性,逐渐成为“国民工具”。然而,Python相比编译型语言,如C语言,运行速度并不理想。但是其本身也有提高速度的方式—编译成.pyc格式的字节码文件。它的好处是直接由解释器执行.pyc速度更快;可以隐藏待发布的程序细节,让别人不能直接看到代码内容。本文将介绍下.pyc文件的相关知识。

2 Python的特点

首先我们需要介绍下Python的特点:

  • 源码距离底层更远;
  • 运行时都需要生成字节码,交由解释器执行;
  • 每次执行脚本,虚拟机总要多出加载和链接的流程,所以相比于编译型语言速度慢。

其中,.pyc文件是py文件编译后生成的字节码文件(byte code)。.pyc文件经过python解释器最终会生成机器码运行,所以.pyc文件是可以跨平台部署的。在我们运行python文件的时候,首先就会自动查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。

3 pyc特点

  • .pyc文件是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高;
  • 可以实现源码隐藏,以及一定程度上的反编译。因此,不同版本的python可能运行不了.pyc文件
  • 需要调用自定义模块的话,自定义模块的pyc文件名要改成 <原文件名.pyc>。
  • 运行pyc文件时用的python版本要和生成pyc文件的python版本一致,否则会出现Bad magic number in .pyc file错误

4 pyc文件如何产生

当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码,整体执行流程如下:

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

5 生成pyc文件方法

分为编译单个文件多个文件,通过命令行操作如下:

代码语言:javascript
复制
# 单个文件
python -m py_compile 脚本.py

# 多个文件
python -m compileall 脚本文件所在目录

通过IDLE操作如下:

代码语言:javascript
复制
# 单个文件
import py_compile
py_compile.compile(r'脚本.py')

# 多个文件
import compileall
compileall.compile_dir(r'脚本文件所在目录')

运行pyc

代码语言:javascript
复制
python 脚本.pyc

6 _pycache__文件夹

解释器首先将其编译为字节码(这是过度简化)并将其存储在__pycache__文件夹中。如果你查看那里你会发现一堆文件在项目文件夹中共享.py文件的名称,只有它们的扩展名为.pyc。它们分别是程序文件的字节码编译版本。

尽管产生了编译文件,但是这些文件与源代码不在同一目录可能会带来调用问题。因此常常使用如下方式产生同级目录下的.pyc文件:

代码语言:javascript
复制
python -m compileall -b . # 在脚本所在目录下运行

加上参数-b就可以了。

7 发布python程序过程

在实际发布程序时,可遵循如下几步:

1、编译生成pyc文件,建议增加-O优化项

代码语言:javascript
复制
python3 -O -m compileall -b .

2、删除py文件

代码语言:javascript
复制
find . -name "*.py"|xargs rm -rf   

3、删除__pycache__目录

代码语言:javascript
复制
find . -name "__pycache__" |xargs rm -rf

4、打成tar包

代码语言:javascript
复制
cd .. 
tar -cjvf xxx.1.1.0.0.tar.bz2 xxx  

此外还有.pyd、.pyo格式,具体差异可查看:

https://stackoverflow.com/questions/8822335/what-do-the-python-file-extensions-pyc-pyd-pyo-stand-for

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-11,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Python数据分析实例 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 简介
  • 2 Python的特点
  • 3 pyc特点
  • 4 pyc文件如何产生
  • 5 生成pyc文件方法
  • 6 _pycache__文件夹
  • 7 发布python程序过程
    • 1、编译生成pyc文件,建议增加-O优化项
      • 2、删除py文件
        • 3、删除__pycache__目录
          • 4、打成tar包
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com