如何将argparse解析的参数正确传递给PySerial API
PySerial字符串参数转常量解决方案
你遇到的问题本质是用户输入的是常量的字符串名称,而PySerial需要的是常量对应的实际数值,有两种常用解决方案:
方案1:动态读取模块属性(最简洁)
PySerial的所有串口配置常量都是serial模块的公开属性,可以用Python内置的getattr()方法直接通过字符串获取对应的常量值,不需要额外写映射逻辑,配合你已经加的choices参数校验,不会出现非法取值的问题。
同时你原代码存在2处笔误需要修正:
- 流控制变量名定义为
FlowC,传参时错误写为FlowChart argparse中直接设置type=bool无法正确解析布尔参数,传入任何非空字符串都会被识别为True,建议改为action='store_true'或者自定义转换逻辑。
修改后的完整代码如下:
import serial import argparse ap = argparse.ArgumentParser() ap.add_argument("-p", "--Port", required=True, help="specify Port Name") ap.add_argument("-b", "--Baud", type=int,required=True, help="Specify Baud rate") ap.add_argument("-t", "--timeout", type=float,required=True, help="Connexion Timeout") ap.add_argument("-d", "--ByteSize",default="EIGHTBITS",choices=['FIVEBITS','SIXBITS','SEVENBITS','EIGHTBITS'], help="Specify the Data bits number") ap.add_argument("-s", "--StopBits", default="STOPBITS_ONE",choices=['STOPBITS_ONE','STOPBITS_ONE_POINT_FIVE','STOPBITS_TWO'], help="StopBits Value") ap.add_argument("-pa", "--parity", default="PARITY_NONE",choices=['PARITY_NONE','PARITY_EVEN','PARITY_ODD','PARITY_MARK','PARITY_SPACE'], help="Set up the Parity Bit") ap.add_argument("-f", "--FlowControl", action='store_true', default=False, help="Enable hardware flow control") args = vars(ap.parse_args()) Port = args["Port"] BaudRate = args["Baud"] Timeout = args["timeout"] # 字符串转serial常量 ByteSize = getattr(serial, args["ByteSize"]) Stop = getattr(serial, args["StopBits"]) Parity = getattr(serial, args["parity"]) FlowC=args["FlowControl"] ser=serial.Serial(Port,BaudRate,bytesize=ByteSize,parity=Parity,stopbits=Stop,timeout=Timeout,xonxoff=FlowC)
方案2:手动定义映射字典(安全性更高)
如果需要完全控制取值范围,避免getattr可能的意外取值风险,可以手动定义字符串到常量的映射表:
# 提前定义配置映射关系 BYTE_SIZE_MAP = { "FIVEBITS": serial.FIVEBITS, "SIXBITS": serial.SIXBITS, "SEVENBITS": serial.SEVENBITS, "EIGHTBITS": serial.EIGHTBITS } STOP_BITS_MAP = { "STOPBITS_ONE": serial.STOPBITS_ONE, "STOPBITS_ONE_POINT_FIVE": serial.STOPBITS_ONE_POINT_FIVE, "STOPBITS_TWO": serial.STOPBITS_TWO } PARITY_MAP = { "PARITY_NONE": serial.PARITY_NONE, "PARITY_EVEN": serial.PARITY_EVEN, "PARITY_ODD": serial.PARITY_ODD, "PARITY_MARK": serial.PARITY_MARK, "PARITY_SPACE": serial.PARITY_SPACE } # 取值时调用映射即可 ByteSize = BYTE_SIZE_MAP[args["ByteSize"]] Stop = STOP_BITS_MAP[args["StopBits"]] Parity = PARITY_MAP[args["parity"]]
内容的提问来源于stack exchange,提问作者Compact Starforce
相关产品推荐
相关产品推荐

