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

2023-11-17

在进行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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中利用compileall将py项目打包成pyc项目 的相关文章

随机推荐

  • EFK实战Kibana之查询语法、导出CSV文件、安装插件(持续更新中)

    概述 EFK 是ELK即ElasticSearch Logstash Kibana的升级版 把Logstash替换成Fluentd 实战 查询语法 选择日志索引后 搜索 可以简单的使用 Lucene通用的语法 或使用基于JSON格式Quer
  • Leetcode 13. 罗马数字转整数(关于枚举)

    罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 XII 即为 X II 27 写
  • 机器学习中的多分类任务入门

    摘要 这篇文章主要是关于机器学习中多分类任务的一些基本知识 1 我先抛出一个问题 在LR 逻辑回归 中 如何进行多分类 一般下 我们所认识的lr模型是一个二分类的模型 但是 能否用lr进行多分类任务呢 答案当然是可以的 不过 我们需要注意的
  • VSCode运行Java报错No delegateCommandHandler for vscode.java.resolveMainMethod

    VSCode运行Java报错No delegateCommandHandler for vscode java resolveMainMethod 今天快气死了 平时vscode好好的 今天不知道怎么了 运行Java程序突然报错No del
  • Python: Decorator Pattern

    DuDecorator py 装饰模式 Decorator Pattern import six https pypi org project six from abc import ABCMeta six add metaclass AB
  • 中断和串口的介绍

    一 中断的介绍 1 什么是中断 中断是指计算机运行过程中 出现某些意外情况需要主机干预时 机器能自动停止正在运行的程序并转入处理新情况的程序 处理完毕后又返回原被暂停的程序继续运行 2 中断都有哪些 中断主要分为系统中断和外部中断 3 中断
  • GauGAN (SPADE) 水记 (seg2img)

    GauGAN SPADE 水记 seg2img 根据语义mask生成图像 论文 Semantic Image Synthesis with Spatially Adaptive Normalization https arxiv org p
  • rsa非对称加密

    RsaUtil 私钥加密 公钥解密 import lombok extern slf4j Slf4j import sun misc BASE64Decoder import sun misc BASE64Encoder import ja
  • 在python中输入10个整数并求出最大值_python练习题 :用户任意输入10个整数到列表中,然后由大到小排列并输出。...

    一 填空题 1 python是一种面向 对象 的高级语言 2 python可以在多种平台运行 这体现了python的 可移植 特性 3 python源代码被解释器转换后的格式为 pyc 4 python3 x默认使用的编码是 UTF 8 5
  • 对数和指数

    参考 https www zhihu com question 21453993 这就相当于先发明减法符号 再发明加法符号 1614年 纳皮尔发明了对数和对数表 1637年 法国数学家笛卡儿发明了指数 比对数晚了20多年 1770年 欧拉才
  • 判断设备联网状态(Python)

    判断设备联网状态 Python 在Python中利用socket来判断设备是否联网 通过ping命令来验证设备的网络状态 完整代码如下 import socket def isNetOK testserver s socket socket
  • zed双目摄像头 +yolo进行双目测距

    zed双目摄像头 yolo进行双目测距 首先根据你电脑或者jetson系列中的cuda版本下载对应的zed sdk 去安装zed api 安装过程可能会出现import pyzed sl as sl ImportError DLL load
  • b站黑马的Vue快速入门案例代码——计数器

    目录 目标效果 重点原理 1 创建Vue实例的时候 2 v on 为元素绑定事件 3 v text 解析文本用 设置标签的文本值 v text 简写 为 实现步骤 代码部分 1 计数器模板 html 全是重点 2 index css 辅助作
  • ubuntu下安装jdk

    ubuntu下的jdk 氛围open jdk和oracle jdk两种 前者是开源的 其实也行 不过大部分人使用的还是oracle jdk 有些博客推荐用ppa的方式安装 但这个安装的链接被墙了 所以经常会安装失败 现在介绍另一种 手动解压
  • 解决vscode远程安装插件不了、安装太慢问题

    一 问题描述 一直显示正在安装 几个小时也没动静 特别是那个c c 插件的安装 二 解决方法 1 采用手动安装插件的方式 步骤 先去这个网站找你要安装的插件 然后下载到本地电脑 All categories Extensions Visua
  • React 入门教程系列(三)——JSX 和 虚拟 DOM

    文章目录 1 JSX 2 虚拟 DOM 3 实例1 4 实例2 5 源码 1 JSX JSX的全称是 JacaScript XML 是 React 定义的第一种类似于 XML 的 JS 拓展语法 JSX 的语法大致遵循下面几条 标签名任意
  • C++中拷贝构造函数的四种调用方式

    代码 define CRT SECURE NO WARNINGS include
  • 分享一个iec104协议的资源,一个模拟iec104协议主站端的小工具

    最近编写的iec104协议的软件也基本稳定了 现在上传到资源上去留作备份 可实现功能 V1 005 2019 331 1 增加启动调用可执行文件目录下104 ini 调用遥信点表功能 增加显示SOE功能 2 增加显示SOE功能 根据读取的点
  • 数据库批量插入,存在则更新,不存在则插入

    INSERT ON DUPLICATE KEY UPDATE 语句 在并发量比较高的时候 可能两个线程都查询某个记录不存在 所以会执行两次插入 然后其中一条必然会因为主键 这里说的主键不是递增主键 冲突而失败 数据库层MySQL中INSER
  • Python中利用compileall将py项目打包成pyc项目

    在进行python项目开发的时候一定会涉及到项目打包这个环节 有时因为一些依赖的原因没法打包成一个大的可执行文件 但为了代码的安全性我们最起码需要打包成pyc的预编译格式 这样运行者 一般是测试和线上部署 在无法看到程序源码的同时也能顺利执