隐藏 py 文件
掌握 Python 代码编译的几种方式
理解 pyc、pyd 文件的区别与局限
能实现基础的代码保护与分发
核心讲解
Python 是解释型语言,默认分发源码,但有时候需要隐藏源码,Python 提供了几种编译 / 混淆方案,保护程度不同。
(1)pyc 字节码文件
Python 运行时会把.py 编译成字节码.pyc,存在__pycache__目录里,解释器执行的其实是 pyc。
特点:运行速度略快,看不到源码,但很容易反编译
生成方式:
py_compile模块、compileall模块局限:反编译工具很多,几乎等于没保护,只能防小白
注意:pyc 和 Python 版本绑定,不同版本不兼容
(2)pyd 二进制扩展文件
把 Python 代码转成 C 语言,再编译成.dll/.so 格式的二进制文件,也就是 pyd。
特点:真正的二进制,很难反编译,保护程度高,运行速度也更快
生成工具:Cython
局限:编译麻烦,需要 C 编译器,调试困难
(3)代码混淆
修改代码结构,变量名替换成无意义字符,增加阅读难度,不影响运行。
特点:源码还是源码,只是看不懂,保护程度中等
工具:pyarmor、pyminifier
局限:专业人士还是能看懂逻辑
(4)方案选择
简单防查看:pyc
中等保护:代码混淆
高强度保护:Cython 编译 pyd + 混淆
终极保护:打包 exe + 加壳
代码示例
# ===== 1. 编译pyc文件 =====
import py_compile
import compileall
# 编译单个文件
py_compile.compile("test.py", cfile="test.pyc")
print("单个文件编译完成")
# 批量编译目录下所有py文件
compileall.compile_dir("src/", force=True)
print("批量编译完成")
# 运行pyc文件:直接 python test.pyc 即可
# ===== 2. Cython编译pyd(示例) =====
# 步骤:
# 1. 安装Cython:pip install cython
# 2. 编写setup.py
# 3. 执行 python setup.py build_ext --inplace
# setup.py 示例代码
"""
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("your_module.py")
)
"""
# ===== 3. 代码混淆示例(pyarmor) =====
# 安装:pip install pyarmor
# 混淆命令:
# pyarmor gen test.py
# 生成的dist目录里就是混淆后的代码
常见误区
以为 pyc 很安全:pyc 可以轻松反编译出几乎和源码一样的代码,不要依赖它保护核心代码
pyd 版本兼容问题:pyd 和 Python 版本、操作系统、32/64 位都绑定,兼容性差
完全无法破解:没有绝对安全的方案,只能提高破解成本,无法 100% 防止破解
混淆过度:过度混淆会影响性能,甚至引入 bug,适度即可
课后练习
把一个 Python 脚本编译成 pyc 文件,测试运行
尝试用 py_compile 批量编译一个目录下的所有 py 文件
了解 Cython 的使用流程,尝试编译一个简单函数
思考:什么场景下需要隐藏 Python 源码?

