mbr / tinyrpc

A compact, modular transport and protocol agnostic RPC library. Does jsonrpc v2.
https://tinyrpc.readthedocs.org
MIT License
156 stars 53 forks source link

AttributeError: module 'geventwebsocket' has no attribute 'create_connection' #100

Open vojtooo opened 2 years ago

vojtooo commented 2 years ago

I want to connect RPCClient that uses JSONRPCProtocol and HttpWebSocketClientTransport.

I have installed everything using pip install tinyrpc[websocket]

And then created minimal example

from tinyrpc.client import RPCClient
from tinyrpc.protocols.jsonrpc import JSONRPCProtocol
from tinyrpc.transports.websocketclient import HttpWebSocketClientTransport
from tinyrpc.transports import ClientTransport

def jsonRpcClientProxy(ip, port, one_way=False):
    url = "http://" + str(ip) + ":" + str(port)
    print(url)
    client = RPCClient(JSONRPCProtocol(), HttpWebSocketClientTransport(url))
    return client.get_proxy(one_way=one_way)

When I call jsonRpcClientProxy I get

File "XX.py", line 9, in jsonRpcClientProxy client = RPCClient(JSONRPCProtocol(), HttpWebSocketClientTransport(url)) File "YY/venv/lib/python3.8/site-packages/tinyrpc/transports/websocketclient.py", line 25, in __init__ self.ws = websocket.create_connection(self.endpoint, **kwargs) AttributeError: module 'geventwebsocket' has no attribute 'create_connection'

Is this some library mismatch?

lnoor commented 2 years ago

I've personally never used websockets; this code was already part of tinyrpc when I took over. However checking the code I believe you are including the wrong dependencies. Try pip install tinyrpc[httpclient] instead of pip install tinyrpc[websocket]. 'http' includes the package websocket-client which does provide a create_connection method.

It looks like pip install tinyrpc[websocket] is used only when creating a websocket based server. I'm not sure that still works though as the gevent-websocket package it fetches from pypi hasn't been updated in 5 years. If you have the time and knowledge I would greatly appreciate if you could verify that the websocket server still works with python 3.