Я пытаюсь использовать native-сообщения в расширении Firefox.Я попытался построить пример из этого https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_messaging
Я скопировал / вставил весь код и настроил его так, как описано на странице, и он отправляет «Ping», но не получает «Pong»назад.В консоли браузера указано TypeError: требуется байтоподобный объект, а не строка 17 в приложении python.Что я могу сделать?
Я использую windows 7 и python 3.x Веб-расширение отправляет объект json в приложение, которое затем проверяет длину и struct.unpacks сообщение.Если сообщение «ping», оно пытается создать struct.pack и json.dumps «pong» ответа, который веб-расширение получает в качестве ответа.Оба сообщения и любые ошибки записываются в console.log.
, в котором говорится в примере:
Обратите внимание, что для запуска Windows требуется Python с флагом -u
,
, чтобы гарантировать, что stdin и stdout открываются в двоичном режиме, а не
, а не в текстовом режиме.
И я настроил стартовый скрипт .bat для включения флага -u,но похоже, что python все еще читает stdin как строку, которая затем выдает TypeError при попытке struct.unpack.
web-расширение background.js для отправки ping:
/*
On startup, connect to the "ping_pong" app.
*/
var port = browser.runtime.connectNative("ping_pong");
/*
Listen for messages from the app.
*/
port.onMessage.addListener((response) => {
console.log("Received: " + response);
});
/*
On a click on the browser action, send the app a message.
*/
browser.browserAction.onClicked.addListener(() => {
console.log("Sending: ping");
port.postMessage("ping");
});
pythonприложение для получения ping и отправки pong:
#!/usr/bin/python -u
# Note that running python with the `-u` flag is required on Windows,
# in order to ensure that stdin and stdout are opened in binary, rather
# than text, mode.
import json
import sys
import struct
# Read a message from stdin and decode it.
def get_message():
raw_length = sys.stdin.read(4)
if not raw_length:
sys.exit(0)
message_length = struct.unpack('=I', raw_length)[0]
message = sys.stdin.read(message_length)
return json.loads(message)
# Encode a message for transmission, given its content.
def encode_message(message_content):
encoded_content = json.dumps(message_content)
encoded_length = struct.pack('=I', len(encoded_content))
return {'length': encoded_length, 'content': encoded_content}
# Send an encoded message to stdout.
def send_message(encoded_message):
sys.stdout.write(encoded_message['length'])
sys.stdout.write(encoded_message['content'])
sys.stdout.flush()
while True:
message = get_message()
if message == "ping":
send_message(encode_message("pong"))
Это строка, которая выдает ошибку TypeError:
message_length = struct.unpack('=I', raw_length)[0]
В журнале должно быть указано: Отправка: ping Получено: pong
В журнале фактически написано: Отправка: ping
stderr output from native app ping_pong: Traceback (most recent call last):
stderr output from native app ping_pong: File "C:\\Users\\ping_pong\\ping_pong.py", line 37, in <module>
stderr output from native app ping_pong: message = get_message()
stderr output from native app ping_pong: File "C:\\Users\\ping_pong\\ping_pong.py", line 17, in get_message
stderr output from native app ping_pong: message_length = struct.unpack('=I', raw_length)[0]
stderr output from native app ping_pong: TypeError: a bytes-like object is required, not 'str'