Script unterbrechen

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
Knollo
User
Beiträge: 30
Registriert: Mittwoch 10. Juni 2020, 14:44

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
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Suchst Du die `terminate()`-Methode auf `Popen`-Objekten‽
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Sirius3
User
Beiträge: 17767
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Knollo
User
Beiträge: 30
Registriert: Mittwoch 10. Juni 2020, 14:44

@_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
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4201
Registriert: Freitag 17. April 2009, 10:28

Und ezu dem "alles" gehört auch, dass du ein Python-Programm aus einem Python-Programm per subprocess startest.
Knollo
User
Beiträge: 30
Registriert: Mittwoch 10. Juni 2020, 14:44

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
Sirius3
User
Beiträge: 17767
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Knollo
User
Beiträge: 30
Registriert: Mittwoch 10. Juni 2020, 14:44

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
Antworten