python 学习之批处理protobuf转pb

本文介绍如何在Mac上使用Python脚本`transProtoCmd.py`自动化批量处理protobuf文件,将其转换为.pb格式。通过获取当前目录,找出所有.proto文件,然后将它们复制到protoc命令所在目录并执行转换,最后将生成的.pb文件和源.proto文件拷贝到目标项目目录。

创建一个python文件transProtoCmd.py(Mac机)
程序入口

import os
import getpass

if __name__ == '__main__':
    username = getpass.getuser()
    os.chdir('/Users/' + username + '/Documents/')
    print os.getcwd()
    handleFile()

os.getcwd()方法获取当前的目录
getpass.getuser() 该函数返回登陆的用户名,不需要参数
os.chdir(‘directoryName’)改变当前工作目录到指定的路径

先来看获取要进行转化的.proto文件有哪些

def getFileInfo():
    t = {}
    # get protobuf srcPath directory from svn download
    # /User/xxx/Documents/public/new_protocol/
    dir = os.getcwd()+os.sep+"public/new_protocol/" 
    # get all .proto file
    for filename in os.listdir(dir):
        curfile = dir + filename
        if os.path.isfile(curfile):
            houzhui = curfile[curfile.rfind('.'):]
            if houzhui == '.proto':
                file = filename[:filename.rfind('.')]
                t[file] = curfile
    # eg. t['aaa'] = /User/xxx/Documents/public/new_protocol/aaa.proto
    return t    

假设要将这些文件转为.pb文件,之前用的方法一直都是将.proto文件手动复制到安装了protobuf的拥有protoc命令文件的同级目录下,然后再单个执行命令protoc –descriptor_set_out xxx.pb xxx.proto,生成的.pb文件当然也是在此命令的同级目录,再复制到项目工程中…
现在要批量处理,本来是想通过protoc –descriptor_set_out (想转成的文件的全路径名)(准备转的全路径名),想一键自动生成,发现一直没成功,那只好代码中实现先将这些.proto原文件(比如直接从svn下载下来的)拷贝到protoc命令的同级目录,对.proto文件循环遍历生成.pb,然后将这些.pb拷贝到项目工程目录。


def handleFile():
    t = getFileInfo()

    username = getpass.getuser()
    os.chdir('/Users/' + username + '/protobuf/src/')

    table = {}
    for key in t.keys():
        filename = key
        pathname = t[key]

        name    = filename + '.proto'
        strpath = '/Users/ximi/Documents/client/MyProj/protobuff/' + filename + '.proto'
        f1 = open(pathname, 'r+')
        f2 = open(name, 'w+')
        f3 = open(strpath, 'w+')

        for s in f1.readlines():
            f2.write(s)
            f3.write(s)

        f1.close()
        f2.close()
        f3.close()

        destname = filename + '.pb '
        srcname  = filename + '.proto'
        cmd = "protoc --descriptor_set_out " + destname + srcname
        os.system(cmd)

        pathname1 = os.getcwd() + '/' + filename + '.pb'
        table[filename] = pathname1

    username = getpass.getuser()
    # destpath = '/Users/' + username + '/Documents/work2/'
    destpath = "/Users/ximi/Documents/client/MyProj/src/app/network/proto/" 
    for key in table.keys():
        filename = key
        pathname = table[key]

        name = destpath + filename + '.pb'
        f1 = open(pathname, 'r+')
        f2 = open(name, 'w+')

        for s in f1.readlines():
            f2.write(s)

        f1.close()
        f2.close()

这样就将/User/ximi/Documents/public/new_protocol/ 文件下的.proto文件通过命令protoc转为.pb文件,全部自动拷贝到我的项目工程目录/Users/ximi/Documents/client/MyProj/src/app/network/proto/ 里面,并将该.proto文件也拷贝到项目目录/Users/ximi/Documents/client/MyProj/protobuff/ 里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值