无法通过subprocess运行Python MQTT订阅脚本问题咨询
问题原因
本次报错和MQTT组件是否支持线程运行无关,完全是subprocess模块的用法错误导致。subprocess.Popen的入参要求是操作系统可执行的命令字符串/命令序列,你直接传入Python函数对象DeviceProvisionSubscribeTest.main,subprocess无法解析,就抛出了「function object is not iterable」的类型错误。
解决方案
分两种场景提供对应实现方式:
场景1:要启动独立进程运行MQTT脚本
有两种可选实现:
- 如果你坚持用
subprocess,需要指定调用Python解释器执行MQTT脚本文件,假设你的MQTT订阅脚本文件名为mqtt_subscribe.py,写法如下:
import subprocess def runProvisionTest(): print("Starting Provision Test...") try: # 命令序列第一个参数是Python解释器路径,第二个是MQTT脚本的绝对/相对路径 p = subprocess.Popen(["python", "mqtt_subscribe.py"]) except Exception as e: print(f"Exception: {e}")
- 如果你想直接调用导入的Python函数开进程,用
multiprocessing模块更合适,写法如下:
import multiprocessing import DeviceProvisionSubscribeTest def runProvisionTest(): print("Starting Provision Test...") try: p = multiprocessing.Process(target=DeviceProvisionSubscribeTest.main) p.start() except Exception as e: print(f"Exception: {e}")
场景2:要在独立线程运行MQTT脚本
paho-mqtt完全支持在线程中运行,没有相关限制,写法如下:
import threading import DeviceProvisionSubscribeTest def runProvisionTest(): print("Starting Provision Test...") try: # daemon=True设置为守护线程,主程序退出时线程会自动销毁 t = threading.Thread(target=DeviceProvisionSubscribeTest.main, daemon=True) t.start() except Exception as e: print(f"Exception: {e}")
额外注意事项
你的MQTT订阅脚本中用到的sub_topic、broker_address、client_id、accountId均为全局变量,直接导入调用函数前请确保这些变量已经完成赋值初始化,否则运行时会抛出变量未定义的错误。
内容的提问来源于stack exchange,提问作者Christopher Fernandez
相关产品推荐
相关产品推荐

