2017-01-18 100 views
1

我试着写是从Mosquitto经纪人订阅数据,以获得来自传感器是在一个特定的主题发布数据的所有消息和数据发送到MySQLdb的Python脚本MQTT为了保存数据Python的MySQL的NameError:全局名称“save_to_db”没有定义

代码:

import paho.mqtt.client as mqtt 
import MySQLdb 

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

def on_message(client, userdata, msg): 
    print(msg.topic+" "+str(msg.payload)) 
     save_to_db(msg) 
client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 
client.connect("192.168.0.132", 1883, 60) 

client.loop_forever() 

testdb = MySQLdb.connect("localhost","root","","testdb") 

def save_to_db(msg): 
    with testdb: 
     cursor = testdb.cursor() 
     try: 
      cursor.execute("INSERT INTO pulses (pulse) VALUES (%s)", (msg.payload)) 
     except (MySQLdb.Error, MySQLdb.Warning) as e: 
      print('excepttion BD ' + e) 
      return None 

但错误会显示:

Traceback (most recent call last): 
    File "sub3.py", line 16, in <module> 
    client.loop_forever() 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1378, in loop_forever 
    rc = self.loop(timeout, max_packets) 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 897, in loop 
    rc = self.loop_read(max_packets) 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1177, in loop_read 
    rc = self._packet_read() 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1766, in _packet_read 
    rc = self._packet_handle() 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2239, in _packet_handle 
    return self._handle_publish() 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2414, in _handle_publish 
    self._handle_on_message(message) 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2574, in _handle_on_message 
    self.on_message(self, self._userdata, message) 
    File "sub3.py", line 10, in on_message 
    save_to_db(msg) 
NameError: global name 'save_to_db' is not defined 

回答

2

你开始循环太早:

client.loop_forever() 

任何代码定义后此线尚未执行,因此,任何功能对象还没有定义。

将该行下移到以下循环运行时需要存在的任何函数。

+0

感谢,但仍然没有工作 –

+0

'文件 “sub3.py”,第29行,在 client.loop_forever()' –

+0

@IstabraqMahmood:没有异常* *的变化,或者是它仍然以其它方式完全一样?在'client.loop_forever()'行产生输出之前是否打印(save_to_db)? –

相关问题