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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:15:02