赞
踩
目录
(1)如下pip安装protobuf并指定版本
- sudo yum install pip #安装pip
- pip install protobuf==2.5.0 #pip安装并指定protobuf的版本;不行的话实时其他版本。
- sudo pip install --upgrade protobuf #更新protobuf版本
- pip install gevent==1.4.0 #pip安装gevent并指定版本
- pip install -i https://pypi.douban.com/simple/ locustio==0.11.0 #pip安装locust并制定版本
同时有python2和python3时使用pip的方法。
python2:
python2 -m pip install XXX
python3:
python3 -m pip install XXX
注:这个安装的时候可能要稍微注意下是python2还是python3安装的。如下是python3安装的。
然后我们在python3下执行 "import google.protobuf" 就是ok的。
在python2下执行就是不ok的。
然后自己的python脚本也注意下引的是哪个。“#!/usr/bin/python3” or “#!/usr/bin/python”
注:pip方式安装的可能会缺少一个一些包,因此还是建议官网源码下载安装。
protoc就是是protobuf的编译器,它可以把proto文件编译成不同的语言。
猜测全称应该是 proto compiler。
(1)protobuf的下载:这里(next可找到更早版本)。此处下载的是protobuf-all-3.5.1.tar.gz。
(2)安装准备:安装protobuf前确保以下软件都已经被安装。方法也很简单yum -y install XXXX即可。
- #下面这些可能都是需要是事先安装的(如果后续安装出错往这里想想)
- autoconf
- automake
- libtool
- make
- g++
- unzip
注1:可能会遇到一个蛋疼的问题。那就是执行make提示你要“yum install make”安装;指令安装语句又提示你“already install”,特别的蛋疼(见下图)。
解决办法:remove后重新安装即可。
- #查看rpm是否安装
- rpm -qa | grep "make"
-
- #通过yum卸载
- yum remove make
-
- #然后重新安装
- yum install make -y
注2:值得注意的是我们要将g++设为默认使用C++11,可以在终端执行:
alias g++='g++ -std=c++11'
但是切记:这个只是临时生效的,永久有效的方法是将上述语句写入/root/.bashrc 文件中。
- vim /root/.bashrc
-
- 添加:alias g++='g++ -std=c++11'
(3)安装protobuf:
执行如下命令,安装时间有点长,耐心等待(可以写成自动化脚本,就无需一步一步执行):
- ./configure
- make #时间有点长
- make check #时间有点长
- sudo make install
- sudo ldconfig # refresh shared library cache.
这时一般来说
libprotobuf库在/usr/local/lib路径下;protoc一般在/usr/local/bin路径下 。如下:
(4)配置环境变量
主要是完善PATH和PKG_CONFIG_PATH等环境变量
$ sudo vim /etc/profile
添加
- export PATH=$PATH:/usr/local/bin/
- export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ #这个参数是必须的
-
- #我添加了这些,感觉有些没有也可以。
- export PATH=$PATH:/usr/local/bin
- export PATH=$PATH:/usr/local/include
- export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
保存生效
source /etc/profile
注:(1)保存生效的语句需要在每个终端都执行一遍才可以生效;
(2)通过echo $PATH / echo $PKG_CONFIG_PATH的方法验证配置在本终端有没有生效。
(3)上述配置中PKG_CONFIG_PATH是必须的(当然其他可能也是必须的),如果没有在编译的时候会报如下错误:
这里的protobuf.pc存了protobuf相关的头文件和库相关的信息,这些信息都是编译的时候要用到的。这里是因为我们使用了pkg-config来方便引用了的,关于pkg-config参见 这里。
(5)配置动态路径
sudo vim /etc/ld.so.conf
追加
/usr/local/lib
然后以root权限更新动态库路径
ldconfig
(6)验证有没有安装成功
执行:
protoc --version
能够显示相应版本信息就说明安装成功。
(7)继续安装python版protobuf的话继续指令如下指令即可:
- #到protobuf解压包的python目录下
- cd ./python
- #依次执行如下语句
- python setup.py build
- python setup.py test
- python setup.py install
之后python脚本导入编译后的pb文件后就不会出现“ImportError: No module named google.protobuf.internal”报错了。
另外:使用python脚本的时候还可能会遇到,如下报错。
Traceback (most recent call last):
File "./200320.py", line 4, in <module>
import com.tencent.epc.innerprocess_pb2 as innerprocess
File "/data/home/shuozhuo/myInner/com/tencent/epc/innerprocess_pb2.py", line 7, in <module>
from google.protobuf import descriptor as _descriptor
File "/usr/lib/python2.7/site-packages/google/protobuf/descriptor.py", line 117
class DescriptorBase(metaclass=DescriptorMetaclass):
^
SyntaxError: invalid syntax
解决方法如下:
- #看起来是版本不匹配!!
- pip install protobuf==3.17.3
https://blog.csdn.net/qq_40837542/article/details/121549356
https://www.cnblogs.com/Primzahl/p/16392682.html
(1)protoc非内置的语言支持需要自己安装语言插件。
比对 --go_out= 对应的就是 protoc-gen-go。
#指定helper可以看到其默认支持的语言插件。
#可以看到包含了常用的C++、python,但是并没有golang。主要是因为golang、dart语言是由google维护,通过protoc的插件机制来实现,所以仓库单独维护了。
protoc --help
(2)安装golang插件protoc-gen-go
# 最新版 $ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest # 指定版本 $ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.3.0
一个完整的编译语句如下:
- protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto
-
-
- #本地编译直接这样就好了
- protoc msg_record.proto --go_out=./
注意事项:protoc-gen-go要求pb文件必须指定go包的路径,即:
option go_package = "protojson/msg_record";
(3)使用举例
1)首先,创建msg_record.proto文件,内容如下:
- syntax = "proto3";
-
- //package msg_record;
- option go_package = "protojson/msg_record";
-
- message TrackRsp{
- uint32 code = 1[json_name = "code"];
- string msg = 2[json_name = "msg"];
- Data data = 3[json_name = "data"];
- }
-
-
- message Data{
- repeated Record records = 1[json_name = "records"];
- uint32 count = 2[json_name = "count"];
- string pen = 3[json_name = "pen"];
- }
-
-
- message Record {
- uint64 time = 1[json_name = "time"];
- repeated MsgContent msg = 2[json_name = "msg"];
- string name = 3[json_name = "name"];
- uint32 receptor = 4[json_name = "receopor"];
- uint32 seqno = 5[json_name = "seqno"];
- uint32 msg_direction = 6[json_name = "msg_direction"];
- uint32 is_recall = 7[json_name = "is_recall"];
- uint32 is_graybar = 8[json_name = "is_graybar"];
- GraybarInfo graybar_info = 9[json_name = "
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。