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