2017-05-03 164 views
0

這裏有很多這個問題的實例,但是當它們嘗試運行腳本時,它們都會列出錯誤。當我嘗試從終端運行我的腳本時,它會考慮一會兒,然後回到正常的終端提示符(沒有錯誤消息)。Python腳本在IDLE中運行,但不在終端中

我是新來的Python,所以請原諒我,如果我只是做錯了什麼,但爲了我的生活。 。 。當在IDLE中打開/運行時,它運行得非常好。

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() 

如果你想知道,我一直在努力(與mqtt.py是文件名)運行這個使用命令python mqtt.py。另外,我在IDLE和終端中都使用了Python2.7。

+0

如果它認爲它一秒鐘,然後返回到沒有錯誤的提示,通常意味着它運行完成。 –

+0

這是我的一個想法,但'client.loop_start'行應該保留它,直到取消。 。 。或者至少我認爲它應該。無論哪種方式,它從IDLE運行時繼續運行並偵聽MQTT帖子。 – LiquidDrummer

回答

1

當您致電loop_start()時,您在另一個線程上啓動客戶端,但在此之後腳本結束並且進程終止,因此沒有任何反應。

如果您希望客戶端繼續運行,無論是sleep()在你的主線程loop_start()後,或代替,叫loop_forever(),這將循環在當前線程,因此你的腳本將不會終止。

查看網絡迴路部分中的documentation

+0

就是這樣。謝謝!我知道這一定很簡單。我正在使用的教程沒有提到調用'loop_forever()'。只是要表明我應該仔細閱讀文檔。 – LiquidDrummer

相關問題