2017-05-03 7 views
0

여기에는이 문제의 인스턴스가 많이 있지만, 스크립트를 실행하려고 할 때 모두 오류를 나열합니다. 터미널에서 스크립트를 실행하려고하면 잠시 생각한 다음 정상적인 터미널 프롬프트로 돌아갑니다 (오류 메시지없이).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()으로 전화를 걸면 다른 스레드에서 클라이언트가 시작되지만 그 직후에 스크립트가 끝나고 프로세스가 종료되므로 아무 일도 일어나지 않습니다.

클라이언트가 계속 실행되도록하려면 loop_start() 이후 주 스레드에서 sleep()을 호출하거나 loop_forever()으로 전화를 걸면 현재 스레드에서 반복되므로 스크립트가 종료되지 않습니다.

documentation의 섹션의 네트워크 루프를 참조하십시오.

+0

그게 전부였습니다. 고맙습니다! 나는 그것이 단순해야만한다는 것을 알았다. 내가 사용하고있는 튜토리얼은'loop_forever()'를 호출하는 것에 대해 아무것도 보여주지 않았습니다. 그냥 내가 더 가까운 문서를 읽어야한다는 것을 보여주기 위해 간다. – LiquidDrummer