Как вызвать функцию python и вернуть ее с сообщением, полученным от socketio? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть JS api, к которому я должен подключиться, есть атрибуты, которые я могу вернуть как JSON, и методы, возвращающие то, что мне интересно использовать в моем python коде.

Например, если я вызываю app.isDocumentOpen() в JS API, он возвращает строку 'true'.

Я хочу позвонить из python isdocumentopen() и вернуть python True

Уровень отправки и получения socketio выполняется на стороне сервера, в основном это eval, который выполняет сообщение, которое я отправляю с python.

Он получает событие 'fromWebsite' , evals сообщение внутри него и отправляет событие 'to Python' с возвратом из eval

@sio.on('toPython')
def received(data):
    global t2
    print('I received to python!')
    print(data)
    t2 = time.time()
    print(t2-t1)


def is_document_open():
    global t1
    t1 = time.time()
    sio.emit('fromWebsite', fr'app.isDocumentOpen();')  #<= the server evals this string and emits a signal 'toPython' with the return of the eval


is_document_open() # takes 0.008 seconds

Это способ, которым socket.io рекомендует обрабатывать ответы, но я требовалось, чтобы ответ находился внутри самой функции is_document_open.

Я пробовал сделать это ниже, и он работает, но это очень хакерский и медленный. Поскольку я буду вызывать эти методы из python довольно часто и использовать итераторы и т. Д. Для создания функциональности в python, это должно быть как можно быстрее.

queue = []

def is_document_open():
    global t2
    def handler(datareceived):
        queue.append(datareceived)
    sio.emit('fromWebsite', fr'app.isDocumentOpen();') # <- this is a  method on the JS API
    sio.on('toPython', handler=handler)
    while len(queue) == 0:
        continue
    else:
        a = queue[0]
        queue.pop()
        t2 = time.time()
        print(t2-t1)
        return a


def emit():
    global t1
    t1 = time.time()
    print(is_document_open()) 


emit() # this implementation = 0.145 s

Если возможно, я также хотел захватить имя функции is_document_open с помощью декоратора, чтобы я мог проще переводить API, преобразовывая имя функции в верблюжий регистр, что-то вроде

sio.emit('fromWebsite', fr'app.{camelCasePythonFunctionName}();')

...