【问题标题】:Python script running in IDLE but not in terminalPython 脚本在 IDLE 中运行但不在终端中
【发布时间】:2017-05-04 02:55:51
【问题描述】:

这里有很多这个问题的实例,但是在尝试运行脚本时它们都列出了一个错误。当我尝试从终端运行我的脚本时,它会思考大约一秒钟,然后返回到正常的终端提示符(没有错误消息)。

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

如果有人想知道,我一直在尝试使用命令python mqtt.py 运行它(mqtt.py 是文件名)。另外,我在 IDLE 和终端都使用 Python2.7。

【问题讨论】:

  • 如果它考虑了一秒钟然后返回提示没有错误,这通常意味着它运行完成。
  • 这是我的一个想法,但 client.loop_start 行应该一直持续到 cancelled 。 . .或者至少我认为应该这样做。无论哪种方式,它都会在从 IDLE 运行时继续运行并侦听 MQTT 帖子。

标签: python mqtt gpio


【解决方案1】:

当您调用loop_start() 时,您会在另一个线程上启动客户端,但随后脚本结束并且进程终止,因此没有任何反应。

如果您希望客户端继续运行,可以在主线程中 loop_start() 之后的 sleep(),或者改为调用 loop_forever(),这将在当前线程中循环,因此您的脚本不会终止。

请参阅documentation 中的网络循环部分。

【讨论】:

  • 就是这样。谢谢!我知道这一定很简单。我正在使用的教程没有显示任何关于调用loop_forever() 的内容。只是表明我应该仔细阅读文档。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多