2017-05-03 3 views
0

Es gibt viele Instanzen dieses Problems hier, aber alle von ihnen zeigen einen Fehler beim Versuch, das Skript auszuführen. Wenn ich versuche, mein Skript vom Terminal aus zu starten, denkt es für etwa eine Sekunde und kehrt dann zu einer normalen Terminal-Eingabeaufforderung zurück (ohne eine Fehlermeldung).Python-Skript läuft in IDLE, aber nicht in Terminal

Ich bin neu bei Python, also vergib mir, wenn ich einfach etwas falsch mache, aber für das Leben von mir. . . Das funktioniert einwandfrei, wenn IDLE geöffnet/ausgeführt wird.

import paho.mqtt.client as mqtt 
import paho.mqtt.publish as publish 
import RPi.GPIO as GPIO 

RELAY_PIN_1 = 23 
RELAY_PIN_2 = 24 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 
GPIO.setup(RELAY_PIN_1, GPIO.OUT, initial=GPIO.HIGH) 
GPIO.setup(RELAY_PIN_2, GPIO.OUT, initial=GPIO.HIGH) 

def on_connect(client, userdata, flags, rc): 
    print("Connected with result code "+str(rc)) 

    client.subscribe("/amber/1/1") 
    client.subscribe("/amber/1/2") 

def on_message(client, userdata, msg): 
    if msg.topic == "/amber/1/1": 
     if msg.payload == b'ON': 
      GPIO.output(RELAY_PIN_1, GPIO.LOW) 
     elif msg.payload == b'OFF': 
      GPIO.output(RELAY_PIN_1, GPIO.HIGH) 

    if msg.topic == "/amber/1/2": 
     if msg.payload == b'ON': 
      GPIO.output(RELAY_PIN_2, GPIO.LOW) 
     elif msg.payload == b'OFF': 
      GPIO.output(RELAY_PIN_2, GPIO.HIGH) 

client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 
client.connect("10.0.0.163", 1883, 60) 

client.loop_start() 

Falls jemand fragen, ist, ich habe versucht, dies zu laufen mit dem Befehl python mqtt.py (mit mqtt.py der Dateiname ist). Außerdem benutze ich Python2.7 sowohl in IDLE als auch vom Terminal.

+0

Wenn es eine Sekunde lang darüber nachdenkt, kehrt es ohne Fehler zur Eingabeaufforderung zurück, was normalerweise bedeutet, dass es vollständig ausgeführt wird. –

+0

Das ist ein Gedanke, den ich hatte, aber die 'client.loop_start'-Zeile sollte es bis zum Abbruch beibehalten. . . oder zumindest dachte ich es sollte. Wie auch immer, es läuft weiter und wartet auf MQTT-Posts, wenn es von IDLE ausgeführt wird. – LiquidDrummer

Antwort

1

Wenn Sie loop_start() aufrufen, starten Sie den Client in einem anderen Thread, aber gleich danach endet das Skript und der Prozess wird beendet und so passiert nichts.

Wenn der Client behalten wollen laufen, entweder sleep() in Ihrem Haupt-Thread nach loop_start() oder stattdessen rufen loop_forever(), die im aktuellen Thread Schleife und so Ihr Skript nicht beendet wird.

Siehe die Netzwerkschleife Abschnitt in der documentation.

+0

Das war es. Vielen Dank! Ich wusste, dass es etwas Einfaches sein musste. Das Tutorial, mit dem ich arbeitete, zeigte nichts über den Aufruf von 'loop_forever()'. Geht nur um zu zeigen, dass ich die Dokumentation näher lesen sollte. – LiquidDrummer

Verwandte Themen