Seite 1 von 1

script.py | grep "Text" nutzen

Verfasst: Mittwoch 22. Juni 2022, 10:30
von BerndM
Guten Morgen,

ich bin auf ein Problem mit Python Scripts gestoßen, wo ich noch keine Lösung über google gefunden habe.

Ich habe ein Python Script was sich an AWS mittels MQTT hängt und dort die Information abfängt und parst. Dabei gibt dieses Script die Uhrzeit und die übertragene Property laufend aus. Da dieses zuviel mit der Zeit wird, wollte ich das mit grep filtern. Also:

Code: Alles auswählen

script.py | grep "Text"
Leider kommt die Ausgabe erst wenn ich das Script beende. Ich will aber die Ausgabe gleich haben. Mit

Code: Alles auswählen

print (' Text', end='', flush=True)
habe ich es schon probiert. Leider hat das nicht zum Erfolg geführt.

Hat wer eine Idee was ich machen kann, damit dieses funktionier?

Danke, Bernd

Re: script.py | grep "Text" nutzen

Verfasst: Mittwoch 22. Juni 2022, 10:40
von noisefloor
Hallo,

kannst du das Skript (ohne AWS Zugangsdaten) mal posten? Und warum willst du extern mit grep filtern? Bau' den Filter doch einfach in dein Skript ein.
Wenn es wirklich viele Daten sind macht es ggf. Sinn in eine Datei mit Hilfe des logging-Moduls zu schreiben. Dann kann man a) später die Logdatei auswerten und b) wenn notwendig direkt noch logrotate mit einbauen.
Leider kommt die Ausgabe erst wenn ich das Script beende.
Wie erfolgt denn die Ausgabe im Skript? `print` schreibt normalerweise direkt nach stdout.

Gruß, noisefloor

Re: script.py | grep "Text" nutzen

Verfasst: Mittwoch 22. Juni 2022, 21:03
von BerndM
Hallo noisfloor,

ich nutze das print(). Dieses gibt die Zeichen nicht gleich aus. Will man in einer Schleife jeweis ein '*' ausgeben, so wird die Ausgabe erst nach den Newline gemacht. Deswegen muss man

Code: Alles auswählen

print ('*', end='', flush=True)

dafür benutzen.

Hier ist der Code für das MQTT, wobei ich davon ausgehe, das dieses auch ohne MQTT ein Problem sein kann (das ist leider nur ein Auschnitt):

Code: Alles auswählen

    def _mqttOnMessage (self, client, userdata, message):
        msg = str(message.payload.decode("utf-8"))
        data = json.loads (msg)

        if 'rawData' in data:
            dm = data['rawData']
            s_time = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime())
            for key in dm.keys ():
                for idx in range (0, len (self._prop_cfg)):
                    if key == self._prop_cfg[idx]['IDX']:
                        if None == self._prop_cfg[idx]['strFunc']:
                            s = str (dm[key])
                        else:
                            s = self._prop_cfg[idx]['strFunc'] (dm[key])
                        print ('%s : %s : %s' %(s_time, self._prop_cfg[idx]['Name'], s))
                        break
        elif 'type' in data:
            # received ACK from an action
            s_time = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime())
            print ('%s : %s' %(s_time, data['type']))
        else:
            raise ExceptionMqtt ('have no rawData!\n%s\n' %(msg))

    def _mqttOnConnect (self, client, userdata, flags, rc):

        print ('Connected to MQTT Broker: ' + self._mqtt_brocker_adr)
        client.subscribe (self._mqtt_topic + self._device_uuid)

    def _mqttOnDisconnect (self, packet, exc=None):

        print ('Disconnect MQTT Broker')

    def mqtt (self, deviceName = None):

        if None != deviceName:
            self._setDevice (deviceName)
            self.refreshData ()

        # generate client ID with pub prefix randomly
        client_id = f'python-mqtt-{random.randint(0, 1000)}'
        # configure MQTT client
        client = mqtt.Client (client_id)
        client.on_connect    = self._mqttOnConnect
        client.on_message    = self._mqttOnMessage
        client.on_disconnect = self._mqttOnDisconnect
        client.tls_set (ca_certs=self._mqtt_tls_ca_cert, 
                        certfile=self._mqtt_tls_client_cert, 
                        keyfile=self._mqtt_tls_client_key, 
                        cert_reqs=ssl.CERT_REQUIRED,
                        tls_version=ssl.PROTOCOL_TLSv1_2, 
                        ciphers=None)
        client.tls_insecure_set (True)
        # MQTT connect
        client.connect (self._mqtt_brocker_adr, self._mqtt_port)

        client.loop_forever()

Re: script.py | grep "Text" nutzen

Verfasst: Mittwoch 22. Juni 2022, 22:14
von __deets__
Statt print würde ich einfach das logging Modul nutzen. Mit zb via Kommandozeile einstellbarem Level, und ggf. mehreren loggern für verschiedene Bereiche. Das kann dann auch einfach in eine Datei loggen.