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:
Leider kommt die Ausgabe erst wenn ich das Script beende. Ich will aber die Ausgabe gleich haben. Mit
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
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.