Seite 1 von 1
Script unterbrechen
Verfasst: Montag 22. April 2024, 20:29
von Knollo
Halllo in die Runde, das Script ruft die Datei dummy_script.py auf:
Code: Alles auswählen
import subprocess
subprocess.Popen(['python','dummy_script.py'])
die Datei dummy_script.py:
Code: Alles auswählen
import time
counter = 1
while counte < 100:
print('Schleife: ' + str(counter))
counter +=1
time.sleep(1)
Wie kann die Schleife vorzeitig von außen unterbrochen werden?
Danke - Stefan
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 20:37
von __blackjack__
@Knollo: Suchst Du die `terminate()`-Methode auf `Popen`-Objekten‽
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 20:43
von Sirius3
@Knollo: statt ein Skript aufzurufen, solltest Du einfach eine Funktion schreiben, die Du direkt aufrufen kannst. Das Abbrechen sollte kooperativ stattfinden, das heißt, innerhalb der Schleife mußt Du auf eine Bedingung prüfen.
Was soll der Trigger dafür sein, dass die Schleife beendet wird?
Die while-Schleife wäre besser eine for-Schleife und man benutzt f-Strings:
Code: Alles auswählen
def count():
for counter in range(1, 101):
print(f"Schleife: {counter}")
time.sleep(1)
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 20:55
von Knollo
@_blackjack_:
Code: Alles auswählen
import subprocess
subprocess.Popen(['python','QProzess/dummy_script.py'])
x = subprocess.Popen(['python','QProzess/dummy_script.py'])
subprocess.Popen.terminate(x)
unterbricht die Schleife leider nicht....
@ Sirius3: es handelt sich um ein MQTT-Topic welches in einer While-True: Schleife läuft.
Ich bin mir grad unsicher ob es besser ist die Schleife zu löschen und den Topic per subprozess kontinuierlich aufzurufen, oder die Schleife von außen abzubrechen.
Variant 1 scheint der einfachere Weg zu sein?
Danke - Stefan
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 21:34
von __blackjack__
@Knollo: Also eine der beiden Schleifen sollte das beenden. Warum startest Du das externe Programm zweimal?
Methoden ruft man auf dem jeweiligen Objekt auf und nicht die Methode als Funktion von der Klasse mit dem Objekt als Argument.
Ein MQTT-Topic ist nichts was ”laufen” kann. Statt Code zu zeigen der so ähnlich ist, wie das was tatsächlich läuft, wäre es deutlich sinnvoller Code zu zeigen der Tatsächlich läuft, und zu beschreiben was mit *dem* passieren soll.
Schleifen kann man nicht ”löschen”. Das klingt alles ein wenig komisch.
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 21:37
von sparrow
Und ezu dem "alles" gehört auch, dass du ein Python-Programm aus einem Python-Programm per subprocess startest.
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 22:16
von Knollo
Ja gut,
mqtt_pub.py:
Code: Alles auswählen
# !/usr/bin/python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
TOPIC = "inTopic"
BROKER_ADDRESS = "localhost"
PORT = 1883
QOS = 1
if __name__ == "__main__":
client = mqtt.Client()
client.connect(BROKER_ADDRESS, PORT)
print("Connected to MQTT Broker: " + BROKER_ADDRESS)
DATA = "Sensor lesen"
client.publish(TOPIC, DATA, qos=QOS)
client.loop()
mqtt_sub.py:
Code: Alles auswählen
# !/usr/bin/python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
TOPIC = "inTopic"
BROKER_ADDRESS = "localhost"
PORT = 1883
def on_message(client, userdata, message):
msg = str(message.payload.decode("utf-8"))
print("message received: ", msg)
print("message topic: ", message.topic)
#nach 5 Minuten mqqt_pub.py erneut ausführen / subprocess?
def on_connect(client, userdata, flags, rc):
print("Connected to MQTT Broker: " + BROKER_ADDRESS)
client.subscribe(TOPIC)
if __name__ == "__main__":
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT)
client.loop_forever()
die Datei mqtt_pub.py soll aller 5 Minuten ausgeführt werden. Wie ist das möglich?
Danke - Stefan
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 22:35
von Sirius3
Wenn Du alle 5 Minuten etwas senden willst, dann mach das doch einfach in einem Programm, statt zweier.
Code: Alles auswählen
import time
import paho.mqtt.client as mqtt
TOPIC = "inTopic"
BROKER_ADDRESS = "localhost"
PORT = 1883
DATA = "Sensor lesen"
def send(client):
client.publish(TOPIC, DATA, qos=QOS)
def on_message(client, userdata, message):
msg = str(message.payload.decode("utf-8"))
print("message received: ", msg)
print("message topic: ", message.topic)
#nach 5 Minuten mqqt_pub.py erneut ausführen / subprocess?
def on_connect(client, userdata, flags, rc):
print("Connected to MQTT Broker: " + BROKER_ADDRESS)
client.subscribe(TOPIC)
if __name__ == "__main__":
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT)
next_send_time = time.time() + 5 * 60
while True:
left_time = time.time() - next_send_time
if left_time <= 0:
send(client)
next_send_time = time.time() + 5 * 60
else:
client.loop_forever(left_time)
Wobei mir der Sinn noch nicht so ganz klar ist, warum man im selben Zug die selbe Nachricht senden und empfangen will.
Re: Script unterbrechen
Verfasst: Montag 22. April 2024, 22:46
von Knollo
Das Topic wird vom Raspi an einen Arduino gesendet. Der sendet die Messwerte zurück an den Raspi. Das läuft auch soweit.
Die Topics werde ich noch anpassen und morgen auf dem Raspi testen.
Danke - Stefan