python编译pyc、pyo

python3.2以后,使用python -m compileall ./命令编译当前目录及子目录的py文件为pyc时,会在每个目录生成一个__pycache__目录,然后把编译后的pyc文件放入此目录(python2、python3.2之前是在py所在的目录生成pyc文件)。

本人写了一个编译的脚本,主要解决以下两个问题:

      1、python3生成的pyc文件,增加了版本号的功能,而如果直接发布带版本号功能的pyc,则应用程序会提示失败

      2、为了方便发布程序,将pyc从__pycache__目录copy出来

批量编译的程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @file   : compile.py
# @author : shlian
# @date   : 2018/9/14
# @version: 1.0
# @desc   :
import sys
import traceback
import os
import compileall


def re_build(src_dir=""):
    print("********************************************")
    for base_dir, dir_name, file in os.walk(src_dir):
        for item in dir_name:  # find the __pacache__ dir
            if item.find("__pycache__") != -1:
                for dp, dn, file_list in os.walk(os.path.join(base_dir, item)):
                    for cfile in file_list:
                        if cfile.find(".cpython") != -1:
                            new_name = cfile[:cfile.find(".cpython")] + cfile[cfile.rfind("."):]
                            if os.path.exists(os.path.join(base_dir, new_name)):
                                os.remove(os.path.join(base_dir, new_name))
                            os.rename(os.path.join(dp, cfile), os.path.join(base_dir, new_name))

    for base_dir, dir_name, file_list in os.walk(src_dir):
        for _file in file_list:
            if _file in ['main.py', 'compile.py']:
                continue
            if _file.endswith(".py"):
                os.remove(os.path.join(base_dir, _file))


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("usage: {0} src_dir".format(sys.argv[0]))
    else:
        src_dir = sys.argv[1]
        src_dir = os.path.join(os.getcwd(), src_dir)
        try:
            compileall.compile_dir(dir=src_dir, force=True)
            re_build(src_dir)
        except Exception as ee:
            print(traceback.format_exc(ee))

编译的命令只有一行:

 compileall.compile_dir(dir=src_dir,force=True)

其他的是处理文件的位置。

可以进一步修改:将pyc放到一个单独的目录,这样发布的时候直接发布pyc或pyo就可以了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ztenv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值