У меня есть 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}();')