Python项目打包(一):利用compileall将py项目打包成pyc项目

转载自https://blog.csdn.net/Trisyp/article/details/108498313

在进行python项目开发的时候一定会涉及到项目打包这个环节,有时因为一些依赖的原因没法打包成一个大的可执行文件,但为了代码的安全性我们最起码需要打包成pyc的预编译格式,这样运行者(一般是测试和线上部署)在无法看到程序源码的同时也能顺利执行程序功能(后续有机会可以讲讲反编译过程)。
本文主要是分两步完成:
1. 用python设计打包程序pack_pyc.py
2. 因为我是在windows环境下运行的,所以用脚本设计执行文件pack_pyc.bat。保证将文件夹拖到bat文件上能够自动打包。

pack_pyc.py完整代码如下:

import argparse
import datetime
from pathlib import Path
import os
import shutil
import compileall

def main():
parser = argparse.ArgumentParser() # 获取项目的parameters
parser.add_argument("src", type=Path)
args = parser.parse_args()
root = args.src # 根目录
for src_file in root.rglob("*.pyc"): # 先删除根目录下的pyc文件
os.remove(src_file)
compileall.compile_dir(root, force=True) # 将项目下的py都编译成pyc文件
current_day = datetime.date.today() # 当前日期
edition = "1.1.2" # 设置版本号
dest = root.parent / f"{root.name}_{edition}.{'001'}_beta_{current_day}" # 目标文件夹名称
for src_file in root.glob("**/*.pyc"): # 遍历所有pyc文件
relative_path = src_file.relative_to(root) # pyc文件对应模块文件夹名称
dest_folder = dest / str(relative_path.parent.parent) # 在目标文件夹下创建同名模块文件夹
os.makedirs(dest_folder, exist_ok=True)
dest_file = dest_folder / (src_file.stem.rsplit(".", 1)[0] + src_file.suffix) # 创建同名文件
print(f"install {relative_path}")
shutil.copyfile(src_file, dest_file) # 将pyc文件复制到同名文件

if __name__ == '__main__':
main()

 

pack_pyc.bat完整脚本如下:

@echo off
cd %~dp0
echo %*
python pack_pyc.py %*
pause

 

打包步骤图示:
将pack_pyc.bat和pack_pyc.py文件放到想要打包的项目同级文件夹下,然后将项目文件夹拖到bat文件上即可:

 

 

拖完就会立即执行打包程序,因为脚本设置了pause,所以你只需按任意键结束即可:

 

 

然后你就会发现你的文件夹下多了个打包项目:

 

打开看下就知道了,所有的py文件都编译成了pyc文件了:

 

 

想要执行项目只需要用脚本执行主程序即可:python main.pyc

 重要提示:

如果在windows中不行,可以尝试在linux环境下执行pack_pyc.py

先进入虚拟环境中:source /data/workflow_test/python_venv/bin/activate

在项目的根目录下:/data/workflow_test

python pack_pyc.py ./workflow

zip -r workflow_engine20240604.zip ./*

 

 

posted @ 2024-04-10 11:10  藤露  阅读(341)  评论(0编辑  收藏  举报