代码编译
-
把代码编译成pyc文件
import py_compile py_compile.compile(r'code01.py')
或者直接在terminal中运行
python -m py_compile code01.py
编译完成直接删除原文件,直接运行pyc文件即可
-
把一个目录下所有python源文件编译pyc
一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall 。使用方法如下:
import compileall compileall.compile_dir(r'/root/src')
也可以直接用命令行编译一个目录下的文件
python -m compileall ./utils/
编译完成后如果想要直接运行Pyc文件注意两点:
要把pyc文件从pycache目录中移动出来,放到py文件对应的位置
-
修改pyc文件名,生成的pyc文件的文件名一般为***.cpython-36.pyc。pyc文件可以和py文件一样用import导入,但是在此之前需要将pyc文件重命名。举个例子:
例如对model.py生成的pyc文件为model.cpython-36.pyc
如果现在想导入model.cpython-36.pyc,直接用
import model
会报错ImportError: No module named 'model'
需要将model.cpython-36.pyc重命名为model.pyc
注意:
compileall.compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1) 字节编译沿 sys.path 找到的所有 .py 文件。如果所有文件都已成功编译,则返回true值,否则返回false值。 如果 skip_curdir 为true(默认值),则当前目录不包括在搜索中。所有其他参数传递到 compile_dir() 函数。注意,与其他编译函数不同,maxlevels 默认为 0。 在 3.2 版更改: 添加了 legacy 和 optimize 参数。 在 3.5 版更改: quiet 参数更改为多级值。 在 3.5 版更改: legacy 参数只写出 .pyc 文件,而不是 .pyo 文件,无论 optimize 的值是什么。
python compileall 打包发布
确保要发布的包(demo)的根目录中有main.py文件,这个是程序执行入口。
-
编译项目
在命令行中cd到根目录上一级目录
python3 -O -m compileall 项目名称
-
批量改名.pyc文件
find . -name '*.pyc' -exec rename 's/.cpython-35.opt-1//' {} \;
cpython-35 具体的版本要对应上
-
移动.pyc文件
PYC 文件移动pycache文件夹之外
find . -name '*.pyc' -execdir mv {} .. \;
-
清理.py文件
find . -name '*.py' -type f -print -exec rm {} \;
-
清理pycache文件夹
find . -name '__pycache__' -exec rmdir {} \;
-
打包成zip
zip -r pub.zip ./项目名/*
运行时只要将zip文件作为参数即可
python3 pub.zip
最终整合脚本
cd $1
python3 -O -m compileall .
find . -name '*.pyc' -exec rename 's/.cpython-35.opt-1//' {} \;
find . -name '*.pyc' -execdir mv {} .. \;
find . -name '*.py' -type f -print -exec rm {} \;
find . -name '__pycache__' -exec rmdir {} \;
zip -r ../$1.zip ./*
调用方式
chmod +x pycompile.sh
./pycompile.sh demo