首页 > 解决方案 > 无法将 Python 脚本作为子进程运行

问题描述

我正在尝试使用基本脚本将 MQTT 订阅者脚本作为子进程运行,但这会导致异常。该脚本本身运行良好,但是一旦我尝试将其转换为子进程或在线程中运行它,就会导致异常。我不能在单独的线程中运行 MQTT 脚本吗?或者我是否有一些我不知道的冲突,因为我是 Python 新手?

订阅脚本

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))
    print("Subscribing to topic: ", sub_topic)
    client.subscribe(sub_topic, 2)
    print("Listening...")

def on_message(client, userdata, msg):
    print("Message Topic =", msg.topic)
    print("Message Payload =", msg.payload.decode())
    check_if_valid_value(json.loads(msg.payload.decode()))
    
def check_if_valid_value(unpackedjson):
    if "accountid" in unpackedjson:
        print("Attribute exists!")
        if unpackedjson["accountid"] == accountId:
            print("Account Id is correct")
            global correct_message_count

def main():
    client = mqtt.Client(client_id)
    client.on_connect = on_connect
    client.on_message = on_message

    print("Connecting to broker...")
    try:
        client.connect(broker_address)

        client.loop_forever()
    except:
        print("Interrupted Successfully")
        pass

if __name__ == '__main__':
    main()

基本脚本

def main():
    runProvisionTest()

def runProvisionTest():
    print("Starting Provision Test...")
    try:
        p = subprocess.Popen(DeviceProvisionSubscribeTest.main)
    except:
        print("Exception")
        pass

if __name__ == '__main__':
    main()

堆栈跟踪

Traceback (most recent call last):
  File "c:\Users\christopher\Documents\Python Workspace\BaseTest.py", line 32, in <module>
    main()
  File "c:\Users\christopher\Documents\Python Workspace\BaseTest.py", line 11, in main
    runProvisionTest()
  File "c:\Users\christopher\Documents\Python Workspace\BaseTest.py", line 15, in runProvisionTest
    p = subprocess.Popen(DeviceProvisionSubscribeTest.main)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 1360, in _execute_child
    args = list2cmdline(args)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 565, in list2cmdline
    for arg in map(os.fsdecode, seq):
TypeError: 'function' object is not iterable

标签: pythonsubprocessmqttsubscribe

解决方案


推荐阅读