在进行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文件上即可:

Python中利用compileall将py项目打包成pyc项目

Python中利用compileall将py项目打包成pyc项目

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

Python中利用compileall将py项目打包成pyc项目

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

Python中利用compileall将py项目打包成pyc项目

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

Python中利用compileall将py项目打包成pyc项目

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

 

相关文章:

  • 2022-12-23
  • 2021-05-22
  • 2022-12-23
  • 2021-08-01
  • 2021-11-14
  • 2021-05-05
  • 2021-04-16
猜你喜欢
  • 2022-12-23
  • 2021-09-08
  • 2021-11-20
  • 2022-12-23
  • 2021-11-21
  • 2021-05-01
  • 2021-08-21
相关资源
相似解决方案