Python-Mysql NameError: global name 'save_to_db' is not defined

Python-Mysql NameError: global name 'save_to_db' is not defined

我尝试编写 python 脚本 mqtt,它从 Mosquitto 代理订阅数据,以获取来自在特定主题中发布数据的传感器的所有消息,并将数据发送到 mysqlDB 以保存数据

代码:

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

你太早开始循环了:

client.loop_forever()

此行之后定义的任何代码尚未执行,因此尚未定义任何函数对象。

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