Megpróbálok natív üzenetküldést használni egy firefox-kiterjesztésben. Megpróbáltam felépíteni a példát innen: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_messaging
Kimásoltam/beillesztettem az összes kódot és pontosan az oldalon leírtak szerint állítottam be, és küld egy "Ping"-et, de nem kap vissza "Pong"-ot. A böngészőkonzol TypeError üzenetet ír ki: egy bájtszerű objektumra van szükség, nem a python alkalmazás 17. sorában található str'on. Mit tehetek?
Windows 7-et és python 3.x-et használok A webbővítmény egy json objektumot küld az alkalmazásnak, amely ezután teszteli a hosszt, és a struct.kicsomagolja az üzenetet. Ha az üzenet "ping", akkor megpróbálja a struct.pack parancsot, és a json.dump egy "pong" választ küld, amelyet a webbővítmény válaszként kap. Az üzenetek és az esetleges hibák is bekerülnek a console.log fájlba.
a példában ez áll:
Vegye figyelembe, hogy a -u
jelzővel ellátott Python futtatása szükséges a Windows rendszeren,
annak biztosítása érdekében, hogy az stdin és az stdout binárisan nyíljon meg
mint szöveg, mód.
És beállítottam a .bat starter szkriptet, hogy tartalmazza az -u jelzőt, de úgy tűnik, hogy a python továbbra is karakterláncként olvassa be az stdin-t, amely a TypeError-t adja meg, miközben megpróbálja a struct.unpack parancsot.
web-extension background.js a ping küldéséhez:
/*
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 alkalmazás ping fogadásához és pong küldéséhez:
#!/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"))
Ez az a sor, amely a TypeError-t adja:
message_length = struct.unpack('=I', raw_length)[0]
A naplónak ezt kell írnia: Küldés: ping Fogadva: pong
A napló valójában ezt írja: Küldés: 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'