script.py | grep "Text" nutzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BerndM
User
Beiträge: 9
Registriert: Mittwoch 23. April 2014, 14:10

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
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
BerndM
User
Beiträge: 9
Registriert: Mittwoch 23. April 2014, 14:10

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()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten