You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据连接列表动态生成COM端口输入交互?

动态生成COM端口输入项的优化方案

我写了两个Python函数,用来引导用户连接测试用的预定义线缆,确认连接完成后再让用户选择对应的COM端口。现在卡在define_ports()函数里——我想根据实际需要连接的线缆数量,动态生成对应的端口输入项,而不是固定写死prt1、prt2、prt3这三个输入。试了几种for循环写法,但不确定是不是最优的,原代码如下:

ports = list(serial.tools.list_ports.comports())
conec1 = 'USB Captive Cable'
conec2 = 'Serial RS232 Cable'
conec3 = None
cons = [conec1, conec2, conec3]
spar = 0
conec_list = []
for i in cons:
    if i != None:
        conec_list.append(i) 
        spar += 1

def Setup():
    def test_setup(conec1, conec2, conec3):
        "Details what cables need to be connected before test can progress"
        print('\n> > For this test you will need to connect the following:\n')
        for i in conec_list:
            if i != None:
                print(i)
        while True:
            yes = input('> > Please confirm this has been done. y/n ')
            if yes != 'y':
                continue
            else:
                break
        return conec1, conec2, conec3

    def define_ports():
        "Asks user to confrim which Port numbers are to be used for each port connection"
        test_setup(conec1, conec2, conec3)
        print('\n> > The available Port connections are: ')
        for p in ports:
            print(p)
        while True:
            print('\n> > Please confirm which Port numbers are to be used for each connection\n')
            global prt1
            global prt2
            global prt3
            
            for i in conec_list:
                if i != None:
                    prt1 = input(f'- Port number for {conec1}: ')
                    prt2 = input(f'- Port number for {conec2}: ')
                    prt3 = input(f'- Port number for {conec3}: ')
            
            print('\n> > The Port numbers you have selected are: '
                f'{conec1} = {prt1}, '
                f'{conec2} = {prt2}'
                f'{conec3} = {prt3}')

            flash = input('Is this correct? y/n ')
            if flash != 'y':
                continue
            else:
                break
        prt1 = str('COM'+prt1)
        prt2 = str('COM'+prt2)
        prt3 = str('COM'+prt3)
        
    define_ports()

Setup()

优化方案

核心问题是固定全局变量的写法限制了灵活性,换成字典存储线缆-端口映射就能解决。优化后的代码如下:

import serial.tools.list_ports

# 预定义线缆列表,自动过滤None
cables = ['USB Captive Cable', 'Serial RS232 Cable', None]
conec_list = [cable for cable in cables if cable is not None]
available_ports = list(serial.tools.list_ports.comports())

def Setup():
    def test_setup():
        """提示用户连接所需线缆并确认"""
        print('\n>> 本次测试需要连接以下线缆:\n')
        for cable in conec_list:
            print(cable)
        while True:
            confirm = input('>> 请确认已完成连接 (y/n): ')
            if confirm.lower() == 'y':
                break
            print('请完成连接后再确认')

    def define_ports():
        """动态获取用户选择的COM端口"""
        test_setup()
        
        print('\n>> 当前可用的COM端口:')
        for port in available_ports:
            print(port)
        
        while True:
            print('\n>> 请为每条线缆选择对应的端口号:')
            # 用字典存储线缆与端口的映射
            port_mapping = {}
            for cable in conec_list:
                port_num = input(f'- {cable} 对应的端口号: ')
                port_mapping[cable] = f'COM{port_num.strip()}'
            
            # 展示用户选择的结果
            print('\n>> 你选择的端口对应关系:')
            for cable, port in port_mapping.items():
                print(f'{cable} = {port}')
            
            confirm = input('以上信息是否正确?(y/n): ')
            if confirm.lower() == 'y':
                return port_mapping
            print('请重新输入')

    # 获取最终的端口映射,可用于后续测试
    selected_ports = define_ports()
    print('\n>> 端口配置完成,已选择的端口:', selected_ports)

Setup()

关键改进点

  • 用列表推导式提前过滤掉None的线缆,简化后续逻辑
  • 用port_mapping字典替代全局变量,灵活适配任意数量的线缆,避免固定变量的局限
  • 遍历conec_list动态生成输入项,有几条线缆就生成几个输入,完全符合需求
  • 确认环节动态遍历字典展示结果,不管线缆数量多少都能正确输出
  • 统一在输入后添加COM前缀,存储在字典中,后续直接调用即可
  • 优化用户提示的中文表述,更符合使用习惯

内容的提问来源于stack exchange,提问作者Naj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:14:52