windows下python使用protobuf的开门级教程

windows下python使用protobuf的开门级教程

  • windows下python使用protobuf的开门级教程
  • 废话说在前头
  • 一、在windows下编译python所需的protobuf的相关文件
  • 二、将.proto文件编译为对应的.py文件
  • 三、运行google给出的示例
  • 小结
  • 参考

废话说在前头

最近实习公司想用SOA的思想进行平台的搭建,需要把原有的软件拆分为不同的服务,我的任务就是重写一个原有的功能,这个功能设计到python、postgres、rabbitmq和protobuf。protobuf的python实现在网上的内容不是很多,有些试了试并不适合我使用,所以就把我这两天的工作做一个小结,内容非常真实,也写了我碰到的若干错误。但是因为内容非常之少,也不涉及到关键性的知识和技术,连入门级教程都算不上,我只好称他为开门级教程orz。
在不断的试错中,我发现有两样东西几乎是不会出任何差错的:

  1. 官方的网址:https://developers.google.com/protocol-buffers/docs/pythontutorial
  2. 官方给定的示例example

所以有任何疑问在问google之前,先看一眼官方的这两样东西都可能会让你少走很多弯路(血的教训)。当然,你有真的踏破铁鞋也找不到答案的情况,直接在github上留言也可能会有人帮你的,issue地址:https://github.com/grpc/grpc/issues
回到我这篇开门教程里,这篇blog涉及到内容主要有三点,一是在windows下向python添加protobuf的相应的库,二是如何编译.proto文件为.py文件,三是运行示例教程。那就让我们开始吧。

一、在windows下编译python所需的protobuf的相关文件

1、首先下载protobuf源码(后一个是我自己从github上down的,因为版本是3.6.0,因为网不好下了很久,但是这个是完全体,就是我把包括python在内的全部版本都下了下来):
https://github.com/google/protobuf/releases/tag/v3.6.0
或是:https://download.csdn.net/download/u013992365/10570515

2、找到protobuf-3.6.0.zip和protoc-3.6.0-win32.zip两个文件,解压;
3、将protoc-3.6.0-win32\bin下的protoc.exe复制到protobuf-3.6.0\src;
4、cmd窗口下切换到protobuf-3.6.0的python目录下,依次运行以下命令:

  • python setup.py build

    windows下python使用protobuf的开门级教程_第1张图片
    windows下python使用protobuf的开门级教程_第2张图片

  • python setup.py test
    windows下python使用protobuf的开门级教程_第3张图片

  • python setup.py install
    windows下python使用protobuf的开门级教程_第4张图片
    通过以上操作,就在机器中安装了python的protubuf。可以通过import google.protobuf命令来检测是否安装成功,如果成功了就是下图这样,如果报错了就是失败了。
    windows下python使用protobuf的开门级教程_第5张图片
    安装之后我检查了一下,在AppData\Local\Programs\Python\Python37\Lib\site-packages\google\protobuf下多了相关的文件。

二、将.proto文件编译为对应的.py文件

接下来是关于编译.proto文件。我编译的是\protobuf-3.6.0\examples目录下的addressbook.proto文件。
首先是编译该目录下的addressbook.proto文件。为了方便处理,我在E盘下建立了一个E:\protoc文件夹,专门用来处理protoc编译,同时我也把protoc加入到了环境变量方便使用。
windows下python使用protobuf的开门级教程_第6张图片
现在把示例的\protobuf-3.6.0\examples\addressbook.proto放在E:\protoc目录下。
通过查看文档可以知道编译文件所需要的指令样式为:

protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto

其中$SRC_DIR是待编译的.proto文件的目录位置,$DST_DIR是想要将生成的文件放在的目录位置,如果不提供值则使用当前目录。
参考:https://developers.google.com/protocol-buffers/docs/pythontutorial
事实上我反复使用这个指令没有成功……,总是提醒我"Permission denied",所以我放弃了这个方法,按照我自己的理解在cmd中写了如下指令:

protoc .\addressbook.proto --python_out .\

这里写图片描述
奇迹出现了,错误变为了
windows下python使用protobuf的开门级教程_第7张图片
这证明我们的方式是正确的,只是编译的文件有点问题。我打开addressbook.proto文件发现他其中确实有一句

import "google/protobuf/timestamp.proto";

这个文件的位置是\protobuf-3.6.0\src\google\protobuf里,我们把它放在我们的E:\protoc下,再进行一次编译,还是有一个错误:
windows下python使用protobuf的开门级教程_第8张图片
不要着急,仔细看看这个错误的说法,他说包含的这个文件是不存在的,也确实是和我们的路径不一样,所以我们有两种办法,一个是建立google/protobuf的目录,并且把文件放进去(或者当时就把\protobuf-3.6.0\src\google\整个文件里的所有东西都拷贝一份),另一个就是把引用的方式改一下,把addressbook.proto文件中的
import "google/protobuf/timestamp.proto"
改为
import "timestamp.proto"
再运行我们的指令

protoc .\addressbook.proto --python_out .\

这里写图片描述
bingo,成功啦!
我们成功生成文件addressbook_pb2.py在当前目录下。
这里写图片描述

三、运行google给出的示例

现在我们进行示例的运行,示例的代码放在\protobuf-3.6.0\examples目录下,我们为了方便测试我们新建一个文件夹\exampletest,把add_person.py和list_people.py两个示例文件以及刚生成的文件addressbook_pb2.py放在我们的\exampletest目录下,示例的运行还需要刚才的timestamp文件,所以我们把他也编译一下,将生成的timestamp_pb2.py文件也放在\exampletest目录下,这样我们就有了四个文件。
windows下python使用protobuf的开门级教程_第9张图片
直接运行add_person.py,提示一个错误:
这里写图片描述
原来是还差一个参数,猜想应该是一个保存二进制protobuf的文档,所以就新建一个addressbook.txt,再运行就正常了。
windows下python使用protobuf的开门级教程_第10张图片
完成一次输入后,可以用list_people.py来显示刚才的输入,我们通过python list_people.py addressbook.txt可以把存进去的显示出来:
windows下python使用protobuf的开门级教程_第11张图片
至此,我们的测试也就完成了。

小结

总结一下,如果想要使用protobuf的话,我们需要

  1. 下载protobuf相关文件,对对应语言进行编译,得到相关的运行库;
  2. 通过protoc程序对我们需要的.proto文件进行编译,得到我们需要的语言的相应文件(本文就是.py文件啦)
  3. 将我们生成的文件放在我们所需要的工作目录下,按照我们所使用的语言的语法规则来写就ok啦。

ps.这篇的每一步我都是实际试过了,如果有问题欢迎留言交流。

参考

https://github.com/grpc/grpc/issues/12814
https://blog.csdn.net/losophy/article/details/17006573
https://blog.csdn.net/lluozh2015/article/details/53106475
http://sharley.iteye.com/blog/2375044

你可能感兴趣的:(python,protobuf)