WebHU - Programozási kérdések és válaszok

A natív üzenetküldő firefox kiterjesztési példa: A ping_pong nem működik TypeError miatt

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'

Válaszok:


1

A Python 2 használatával jól működik (Linuxon).

#!/usr/bin/python2 -u

or

path\to\python2

a Windows kötegfájljában, ill.

Ahhoz, hogy a Python 3ban működjön, a kódolt karakterláncot egy struktúrába kell csomagolnia (nem tudom miért – de működik):

#!/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():

    # use buffer to get bytes
    raw_length = sys.stdin.buffer.read(4)


    #raise ValueError(raw_length)

    if not raw_length:
        sys.exit(0)
    message_length = struct.unpack('=I', raw_length)[0]
    message = sys.stdin.buffer.read(message_length).decode("utf-8")
    return json.loads(message)


# Encode a message for transmission, given its content.
def encode_message(message_content):
    encoded_content = json.dumps(message_content).encode("utf-8")
    encoded_length = struct.pack('=I', len(encoded_content))
    return {'length': encoded_length, 'content': struct.pack(str(len(encoded_content))+"s",encoded_content)}


# Send an encoded message to stdout.
def send_message(encoded_message):
    #raise ValueError(encoded_message)
    sys.stdout.buffer.write(encoded_message['length'])
    sys.stdout.buffer.write(encoded_message['content'])
    sys.stdout.buffer.flush()


while True:
    message = get_message()
    if message == "ping":
        send_message(encode_message("pong"))
25.09.2019
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..