python 是一种解释性语言,其执行时先将代码编译到内存中的 PyCodeObject 中,当程序运行结束后,将 PyCodeObject 写入到硬盘的 .pyc 文件中。当下次运行时,首先检查是否有 .pyc 文件,如果找到,那么就直接载入 .pyc 文件;否则直接编译 .py 到内存中形成 PyCodeObject。.pyc 可以理解为 PyCodeObject 的持久化保存。

编译py为pyc

命令行编译

1
2
3
4
5
6
7
8
# compile 单个文件
python -m py_compile hello.py

# 编译文件夹下的所有文件,和 .py 同文件夹
python -O -m compileall -b -f hello_dir

# 编译后放到 __pycache__
python -O -m compileall -f hello_dir

代码中编译

1
2
3
4
5
6
7
# 单个文件
import py_compile
py_compile.compile(r'hello.py')

# 多个文件
import compileall
compileall.compile_dir(hello_dir)

打包为可执行文件

如 PyInstaller、cx_Freeze、py2exe 等。

代码混淆

如 Pyminifier、PyArmor、Nuitka 等。

参考文献

  1. 隐藏源码细节:Python脚本编译pyc文件
  2. 隐藏python代码原文件