基于cython的protobuf编译器

pyrobuf的Python项目详细描述


{ Br.Br/>>BR/><介绍> BR/> BR/> PythBuF是谷歌Python原型BuBF库的替代物。
> BR> >它使用谷歌的Python Br/>原Bug库,使用其C++后端,比谷歌快20~40X,生成快的Cython代码,其速度比谷歌的Python
原BoF库快2~4倍。纯python
实现。

更重要的是,pyrobuf是自包含的,易于安装。



如果你想为pyrobuf做贡献,你可能还想安装pytest.


pyrobuf*不需要protoc.



pyrobuf似乎在osx上工作,Linux和Windows(对于后者来说,让cython正常工作是最棘手的一点,特别是如果您仍在使用
2.7的话)。



Pyrobuf处理
AppNexus和其他贡献者的用例,但还没有完全取代
Protoc将生成的内容。



分叉并克隆存储库,然后运行:

$python setup.py develop

它将生成特定于平台的"pyrobuf"列表,然后编译
"pyrobuf"列表和"pyrobuf util"模块。




$py.test

或使用"test"命令(如果还不可用,则安装pytest):

$python setup.py test

任一方法都将自动生成
"tests/proto"中的所有protobuf消息规范,并将"pythonpath"指向之前生成的消息运行
测试。

如果需要,重新运行"develop"或"test"命令将自动重新构建
"pyrobuf list"和"pyrobuf util"模块。


对您的某个proto文件不起作用,请在"tests/proto"中添加一个最小的
proto文件,该文件在提交拉取请求之前中断。

包括中断测试的拉取请求是金级的!

改进测试就在眼前。



只是点它!

```
$pip install pyrobuf
```
应该能做到!

检查,您可能需要确保以下命令不会引发异常:


$python-c"import pyrobuf_list"


>如果确实引发异常,请尝试:

`````
$pip install pyrobuf-v-v-v--upgrade--force--no cache



"pip install pyrobuf"获得pyrobuf cli工具…:

$pyrobuf--help
用法:pyrobuf[-h][--out dir out dir][--build dir build dir][--install]
source

a cython-based protobuf compiler

源文件名.proto或包含proto文件的目录

C编译器生成目录[默认:生成]
--安装扩展名[默认:false]
--将要安装的包的名称打包到

如果不想处理setuptools入口点的特殊性,也可以做:

$python-m pyrobuf--help



\proto;使用

在python中,您可以通过运行以下命令导入新的消息类:
```
from test_message_proto import test
```

可以创建新消息:
```
test=test()
```


>;>;test.list戋fieldx.append(12)
>;>;test.test戋ref.field2=3.14
`````


>并访问这些字段:
````
>;test.string戋field
"您好!"
```

至少填写完任何"必需"字段后,我们就可以序列化为一个字节数组:
```
>;>;test.serializeToString()
byteArray(b'\x10\x05\x1a\x06您好!\ x0c2\t\x19\x1f\x85\xebq\xb8\x1e\t@p\x02')
````

我们还可以将protobuf消息反序列化到消息实例:
````
>;>;test.parsefromstring('\x10\x05\x1a\x06您好!\ x0c2\t\x19\x1f\x85\xebq\xb8\x1e\t@p\x02')
25
````
请注意,"parsefromstring"方法返回消耗的字节数。


pyrobuf还允许我们序列化和反序列化json和native
python字典:
````
>;>test.serializetojson()
{"field":5,"req_field":2,"list_fieldx":[12],"string_field":"您好!","test戋ref":{"field2":3.14}'

>;>;test.parseFromJSON('{"field":5,"req戋field":2,"list戋fieldx":[12],"string戋field":"您好!","测试参考":{"field2":3.14}')

>;>test.serializetodict()
{字段:5,
"列表字段x":[12],
"请求字段":2,
"字符串字段":"您好!",
"测试参考:{'field2':3.14}

>;>;测试.parsefromdict({'field':5,'list_fieldx':[12],'req_field':2,'string_field':'hello!',"test-ref":{field2':3.14})
```


最后,"pyrobuf-util"模块包含对整数进行编码和解码的函数。

```
>;>;将pyrobuf-util
>;>;将pyrobuf-util.导入到变量(2**16-1)
bytearray(b'\xff\xff\x03')
>;pyrobuf util.from_varent(b'\xff\xff\x03',offset=0)
(65535L,3)
>;>;pyrobuf util.to_signed_varent(-2**16)
bytearray(b'\xff\xff\x07')
>;>;pyrobuf util.from_signed_varent(b'\xff\x07',offset=0)
(-65536L,3)
```

希望将它们都构建到自己的单独包中,但希望一个包含所有消息的名称空间,您可以指定一个包名:
```
pyrobuf/path/to/proto/specs--install--package=My_Messages
```


>然后您可以从"My_Messages"PakCage导入消息类:
```
>;>;从My Messages导入MyMessage1,MyMessage2
```

setup.py
```

pyrobuf添加一个新的setup关键字"pyrobuf_modules",可用于指定
单个protobuf文件或包含protobuf文件的文件夹。例如,"setup.py"
文件可能如下:

``
安装程序需要=['pyrobuf'],
pyrobuf-modules="proto"

`````

消息。

安装此示例包后,可以如下使用:

```
>;
当谷歌的库用于消息序列化时,当使用谷歌库的C++后端时,对于消息BR/>反序列化的速度是2.3x:
‘BR/> & Python Test/PrimyTest.Py<BR/>谷歌花了1.649168秒来序列化
Pyrobuf花了0.825525秒序列化了
谷歌在不使用C++后端的情况下,Pyrobuf花了0.466113秒的时间才把1.113041秒的时间写在了<,pyrobuf的序列化速度约为25x
,反序列化速度约为55x:
```
谷歌序列化时间为20.215662秒
pyrobuf序列化时间为0.819555秒
谷歌反序列化时间为24.990137秒
pyrobuf反序列化时间为0.455732秒反序列化
```

我们正在努力使您尽可能容易地帮助改进pyrobuf。


在大多数情况下,pyrobuf应该是google
protobuf库的拖放替换。不过,有一些不同。首先,pyrobuf当前没有实现"listfields"、"whichoneof"、"hassextension"、"clearextension"和"bytesize"方法。

其次,pyrobuf只是假设用于给定消息的模式在发送端和接收端是相同的,因此更改
字段的一端不更改另一端可能会导致错误;添加或删除
字段不会打断任何内容。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
打开OrientDB数据库时发生java错误   java Hibernate合并函数偶尔会导致主键冲突   java如何在SourceTransferndexit将msg放入MQ   JavaEclipse不正确地导入项目   Java中的数据结构,带有删除节点后所有节点的操作   java创建zip存档时,什么构成重复条目   java如何计算所有值并比较每个对象?   java Threadflipbegin在Google Pixel 3上被阻止55秒   java Eclipse Hibernate:未找到适合jdbc的驱动程序:mysql://localhost:3306/hibernatedb   java Quartz计划程序未运行   java如何从junit扩展向@Test返回值?   java忽略搜索字段中的大小写   java如何从图库中选取图像,裁剪并保存在数据分区中   java CST/CDT时区更改问题   url从Java读取Twitter页面   java是否要在每个列表项中打开WebView单击?   比较输入值的Java布尔逻辑初学者   如何在服务器端使用java从客户端的HTTP POST请求接收和解析JSON对象   javascript在一个get请求中,如何启动程序,然后使用另一个get请求停止它?