Python中如何使用纯Python的etcd3客户端库?
发现没有好用的就自己写了一个
- 基于 etcd3 的 gRPC-JSON-Gateway
- 90% 的测试覆盖率
- 同时兼容 python2 python3
- 提供了 Lock Transaction Watch Lease 等几种 API 设计友好,使用优雅的工具
Github 地址: https://github.com/Revolution1/etcd3-py
文档地址: https://etcd3-py.readthedocs.io/en/latest/
Quick Start
Install
$ pip install etcd3-py
Sync Client
>>> from etcd3 import Client
>>> client = Client('127.0.0.1', 2379)
>>> client.version()
EtcdVersion(etcdserver='3.3.0-rc.4', etcdcluster='3.3.0')
>>> client.put('foo', 'bar')
etcdserverpbPutResponse(header=etcdserverpbResponseHeader(cluster_id=11588568905070377092, member_id=128088275939295631, revision=15433, raft_term=4))
>>> client.range('foo').kvs
[mvccpbKeyValue(key=b'foo', create_revision=15429, mod_revision=15433, version=5, value=b'bar')]
Async Client (Python3.5+)
>>> import asyncio
>>> from etcd3 import AioClient
>>> client = AioClient('127.0.0.1', 2379)
>>> async def getFoo():
... await client.put('foo', 'bar')
... r = await client.range('foo')
... print('key:', r.kvs[0].key, 'value:', r.kvs[0].value)
>>> loop = asyncio.get_event_loop()
>>> loop.run_until_complete(getFoo())
key: b'foo' value: b'bar'
Transaction Util
>>> from etcd3 import Client
>>> txn = Client().Txn()
>>> txn.compare(txn.key('foo').value == 'bar')
>>> txn.success(txn.put('foo', 'bra'))
>>> txn.commit()
etcdserverpbTxnResponse(header=etcdserverpbResponseHeader(cluster_id=11588568905070377092, member_id=128088275939295631, revision=15656, raft_term=4), succeeded=True, responses=[etcdserverpbResponseOp(response_put=etcdserverpbPutResponse(header=etcdserverpbResponseHeader(revision=15656)))])
Lease Util
>>> from etcd3 import Client
>>> client = Client()
>>> with client.Lease(ttl=5) as lease:
... client.put('foo', 'bar', lease=lease.ID)
... client.put('fizz', 'buzz', lease=lease.ID)
... r = lease.time_to_live(keys=True)
... assert set(r.keys) == {b'foo', b'fizz'}
... assert lease.alive()
Watch Util
>>> from etcd3 import Client
>>> client = Client()
>>> watcher = c.Watcher(all=True, progress_notify=True, prev_kv=True)
>>> w.onEvent('f.*', lambda e: print(e.key, e.value))
>>> w.runDaemon()
>>> # etcdctl put foo bar
>>> # etcdctl put foz bar
b'foo' b'bar'
b'foz' b'bar'
>>> w.stop()
Lock Util
>>> import time
>>> from threading import Thread
>>> from etcd3 import Client
>>> client = Client()
>>> name = 'lock_name'
>>> def user1():
... with client.Lock(name, lock_ttl=5):
... print('user1 got the lock')
... time.sleep(5)
... print('user1 releasing the lock')
>>> def user2():
... with client.Lock(name, lock_ttl=5):
... print('user2 got the lock')
... time.sleep(5)
... print('user2 releasing the lock')
>>> t1 = Thread(target=user1, daemon=True)
>>> t2 = Thread(target=user2, daemon=True)
>>> t1.start()
>>> t2.start()
>>> t1.join()
>>> t2.join()
user1 got the lock
user1 releasing the lock
user2 got the lock
user2 releasing the lock
欢迎使用、顺手 star
Python中如何使用纯Python的etcd3客户端库?
5 回复
支持
用纯Python的etcd3客户端库,我推荐etcd3-py。先装它:pip install etcd3。
基本操作很简单:
import etcd3
# 连接etcd(默认localhost:2379)
etcd = etcd3.client()
# 写数据
etcd.put('/test/key', 'hello etcd')
# 读数据
value, metadata = etcd.get('/test/key')
print(value.decode()) # 输出: hello etcd
# 监听键变化
events_iterator, cancel = etcd.watch('/test/key')
for event in events_iterator:
print(f"Key changed: {event.key.decode()} = {event.value.decode()}")
break # 只看一次变化
cancel() # 停止监听
# 删除键
etcd.delete('/test/key')
如果要集群或认证,初始化时加参数:
etcd = etcd3.client(
host='your-etcd-host',
port=2379,
ca_cert='/path/to/ca.crt',
cert_key='/path/to/client.key',
cert_cert='/path/to/client.crt'
)
这库用gRPC协议,比HTTP的etcd3-py直接。注意它需要etcd服务端版本匹配。
总结:etcd3-py够用了。
支持
支持
可靠吗

