Cython包装的C++ CAPN原库
pycapnp的Python项目详细描述
Pycapnp
可在http://jparyani.github.io/pycapnp/" rel="nofollow">http://jparyani.github.io/pycapnp/上获得更详细的文档。
要求
PyCAPNP的分布不超过C++ 11兼容的要求。 编译程序。GCC 4.8+或Clang 3.3+应该可以正常工作。
pycapnp还有其他的开发依赖项,包括cython和 P.试验请参阅requirements.txt以了解所有信息。
建筑和安装
使用pip install pycapnp安装。您可以设置cc环境 控制使用哪个编译器的变量,即 cc=gcc-4.8 pip安装pycapnp
或者你可以复制回购协议如下:
git clone https://github.com/jparyani/pycapnp.git pip install --install-option '--force-cython' ./pycapnp
注意:对于OSX,如果使用Xcode 5中的clang,则可能需要设置 cflags 像这样:
CFLAGS='-stdlib=libc++' pip install pycapnp
如果您希望使用最新的上游C++CAPN原型:
pip install --install-option "--libcapnp-url" --install-option "https://github.com/sandstorm-io/capnproto/archive/master.tar.gz" --install-option "--force-bundled-libcapnp" .
python版本
支持Python2.7、Python3.4+和PyPy2.1+。
需要注意的一个奇怪之处是 文本 类型字段将被视为字节 python 2下的字符串和python 3下的unicode字符串。 数据 字段将始终被视为字节字符串。
开发
此项目使用 Git流 。 本质上,只要确保您在 开发中进行了更改 分支机构。您可以通过安装pytest来运行测试 pip安装py test ,然后从 测试运行 py.test 目录。
二进制软件包
构建哑二进制分布:
python setup.py bdist_dumb
构建python轮分布:
python setup.py bdist_wheel
如果它失败了 clang:错误:没有这样的文件或目录:"capnp/lib/capnp.cpp" ,然后 你得给拳头打圈。这可以通过以下方法完成:
python setup.py build --force-cython
文档/示例
有一些基本的文件 这里
examples目录中有一个例子很好地展示了pycapnp 很好地.在这里,复制:
from__future__importprint_functionimportosimportcapnpimportaddressbook_capnpdefwriteAddressBook(file):addresses=addressbook_capnp.AddressBook.new_message()people=addresses.init('people',2)alice=people[0]alice.id=123alice.name='Alice'alice.email='alice@example.com'alicePhones=alice.init('phones',1)alicePhones[0].number="555-1212"alicePhones[0].type='mobile'alice.employment.school="MIT"bob=people[1]bob.id=456bob.name='Bob'bob.email='bob@example.com'bobPhones=bob.init('phones',2)bobPhones[0].number="555-4567"bobPhones[0].type='home'bobPhones[1].number="555-7654"bobPhones[1].type='work'bob.employment.unemployed=Noneaddresses.write(file)defprintAddressBook(file):addresses=addressbook_capnp.AddressBook.read(file)forpersoninaddresses.people:print(person.name,':',person.email)forphoneinperson.phones:print(phone.type,':',phone.number)which=person.employment.which()print(which)ifwhich=='unemployed':print('unemployed')elifwhich=='employer':print('employer:',person.employment.employer)elifwhich=='school':print('student at:',person.employment.school)elifwhich=='selfEmployed':print('self employed')print()if__name__=='__main__':f=open('example','w')writeAddressBook(f)f=open('example','r')printAddressBook(f)
此外,pycapnp还获得了rpc特性,包括管道和 承诺式API。请参阅示例中的计算器示例 更好的演示目录:
importcapnpimportsocketimporttest_capability_capnpclassServer(test_capability_capnp.TestInterface.Server):def__init__(self,val=1):self.val=valdeffoo(self,i,j,**kwargs):returnstr(i*5+self.val)defserver(write_end):server=capnp.TwoPartyServer(write_end,bootstrap=Server(100))defclient(read_end):client=capnp.TwoPartyClient(read_end)cap=client.bootstrap()cap=cap.cast_as(test_capability_capnp.TestInterface)remote=cap.foo(i=5)response=remote.wait()assertresponse.x=='125'if__name__=='__main__':read_end,write_end=socket.socketpair(socket.AF_UNIX)# This is a toy example using socketpair.# In real situations, you can use any socket.server(write_end)client(read_end)