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

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

### 如何将 Python 脚本编译并打包PYC 文件 Python 的 `.pyc` 文件是字节码文件,通常由解释器自动生以提高加载速度。以下方法可以手动生 `.pyc` 文件,并将其打包。 #### 使用 `py_compile` 模块 可以通过 `py_compile` 模块单独编译单个 `.py` 文件为 `.pyc` 文件。示例如下: ```python import py_compile py_compile.compile('example.py') # 编译 example.py 为 example.pyc ``` 此代码会将指定的 `.py` 文件编译为 `.pyc` 文件,并存储在 `__pycache__` 目录中[^1]。 #### 使用 `compileall` 模块 如果需要批量编译整个目录下的所有 `.py` 文件,可以使用 `compileall` 模块。以下是命令行方式: ```bash python -m compileall /path/to/directory ``` 这会递归地编译指定目录中的所有 `.py` 文件,并将生的 `.pyc` 文件存放在 `__pycache__` 目录中[^2]。 #### 使用优化模式生 `.pyo` 文件(适用于 Python 2) 在 Python 2 中,可以通过 `-O` 或 `-OO` 参数生 `.pyo` 文件(优化后的字节码文件)。例如: ```bash python -O -m py_compile example.py ``` 此命令会生个优化版本的 `.pyo` 文件。需要注意的是,Python 3 已经废弃了 `.pyo` 文件的概念,优化后的文件仍然以 `.pyc` 形式存在[^1]。 #### 自定义脚本实现批量编译与清理 如果需要更复杂的操作,例如编译后移除原始 `.py` 文件或更改输出路径,可以编写自定义脚本。以下是个简单示例: ```python import os import py_compile def compile_and_remove(directory): for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.py'): py_file = os.path.join(root, file) py_compile.compile(py_file) # 编译为 .pyc os.remove(py_file) # 删除原始 .py 文件 # 调用函数 compile_and_remove('./project_directory') ``` 此脚本会遍历指定目录,编译所有 `.py` 文件为 `.pyc` 文件,并删除原始 `.py` 文件[^3]。 #### 注意事项 - `.pyc` 文件通常存储在 `__pycache__` 目录中,文件名包含 Python 版本信息,例如 `example.cpython-39.pyc`。 - 如果希望直接运行 `.pyc` 文件,可以使用以下命令: ```bash python -m compileall . python -m zipapp dist_dir -p "/usr/bin/env python3" ``` 这会将 `.pyc` 文件打包为可执行的 `.zip` 文件[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值