如何根据连接列表动态生成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
相关产品推荐
相关产品推荐

