python py文件批量转化成pyc实战

什么是pyc文件

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。

为什么需要使用pyc文件

py文件是可以直接看到源码的,鉴于代码的保密性,所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出 py文件源码,网上可以找到一个反编译python,不过你可以自己修改python的源代码中的opcode文件,重新编译 python,从而防止不法分子的破解。目前我采用的是python3.5。

批量生成pyc文件

"""
话不多说  简单介绍一下项目来由及代码功能
1.代码主要是转换py文件为pyc文件保证的代码的基础保密性(没有什么加密是不能破解的成本问题)
2.代码转换后会生成一个压缩包方便携带发送在客户服务器上直接运行
3.py转pyc会有一个非常隐蔽的bug,就是config.ini  以ini结尾的配置文件并不会被保存会在转换过程中被删除
4.pyc是一个非常敏感的小孩子,要保证环境的唯一性,当你转换后不能运行绝大部分都是因为环境问题,那个时候。。。无解重新打包
5.传参过程中,py转pyc可能会出现参数无法传递,主要问题是__pycache__文件夹的影响一定要在转化过程中删除
"""
#-*- encoding=utf8 -*-
import os
import shutil
import tarfile
import compileall

def tar_dir(tar_path):
    # 打包压缩
    dstname = tar_path+'.tar.gz'
    file_name = tar_path.split('/')[-1]
    os.chdir(tar_path.split(file_name)[0])
    tarHandle=tarfile.open(dstname,"w:gz")
    try:

        for dirpath,dirs,files in os.walk(tar_path):
            for filename in files:
                tarHandle.add(os.path.join(file_name+dirpath.split(file_name)[-1],filename))
        tarHandle.close()
        return dstname
    except:
        return False

def compile(source,target):

    compileall.compile_dir(source)

    copyPyc(source,target)


sourceDir = {
    #source目录下的无效文件夹
    "sourceInvalidDir" : ["__pycache__"]
}
def delFiles(source):
    # 递归删除无效文件夹__pycache__
    for root , dirs, files in os.walk(source):
        for dir in dirs:
            if dir in sourceDir["sourceInvalidDir"]:
                shutil.rmtree(os.path.join(root, dir))
                print ("Delete Dir: " + os.path.join(root, dir))

def copyPyc(source,target):

    files= os.listdir(source) #得到文件夹下的所有文件名称

    for file in files: #遍历文件夹
        if str(file).endswith('.ini'):
            shutil.copyfile(os.path.join(source,file),os.path.join(target,file))
        dir = os.path.join(source, file)
        if os.path.isdir(dir): # 如果是文件夹
            target_dir=os.path.join(target,file)
            if(not os.path.exists(target_dir)):
                if(not os.path.basename(target_dir)=='__pycache__'):
                    os.makedirs(target_dir)

            if(os.path.basename(dir)=='__pycache__'):
                for pyc_file in os.listdir(dir):
                    real_target_dir=str.replace(target,'__pycache__','')
                    real_pyc_file=str.split(pyc_file,".")[0]+".pyc"
                    shutil.copyfile(os.path.join(dir,pyc_file),os.path.join(target,real_pyc_file))
            else:
                copyPyc(dir,target_dir)    # 递归执行


if __name__ == "__main__":

    abspath = os.path.abspath(__file__)
	# source 绝对路径加文件名
    source = str(abspath.split('/auto-pyc.py')[0]) + '/dataexa-dl-ccb'
    # target  转换后的文件名
    target = str(abspath.split('/auto-pyc.py')[0]) + '/dataexa-dl-ccb-pyc'

    delFiles(source)    # 删除掉所有 __pycache__

    if not os.path.exists(target):
        os.mkdir(target)
    compile(source,target)
    tar_dir(target)
    #压缩完成后,删除源文件夹
    if os.path.exists(target):
        shutil.rmtree(target)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值