使用subprocess.Popen调用JLinkExe时参数不被识别的问题
问题原因及解决方法
核心问题
你用subprocess.Popen传参时犯了一个常见错误:把多个命令行参数合并成了单个字符串元素。
在终端执行sudo JLinkExe -nogui 1时,shell会自动把空格作为分隔符,将-nogui和1识别为两个独立的参数传递给JLinkExe。但用subprocess.Popen的列表形式传参时,列表里的每个元素都会被直接当作一个完整的参数传给程序,不会再做分割处理。
所以当你写["JLinkExe", "-nogui 1"]时,JLinkExe会把-nogui 1当成一个整体的命令行选项,自然识别不了,就会抛出"Unknown command line option -nogui 1."的错误。同理,传空字符串""时,这个空字符串会被当作一个无效参数,导致提示"Unknown command line option ."。
正确写法
把每个参数拆分成列表的独立元素:
import subprocess def flash() -> None: p = subprocess.Popen( ["JLinkExe", "-nogui", "1"], # 将-nogui和1拆分为两个独立元素 stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, text=True ) response = p.stdout.read() print(response)
补充说明
如果非要用合并的字符串形式传参,可以开启shell模式(不推荐,存在命令注入安全风险),此时subprocess会调用shell解析参数:
p = subprocess.Popen( "JLinkExe -nogui 1", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, text=True, shell=True # 开启shell模式 )
但这种方式在处理外部输入时风险较高,优先推荐拆分参数的列表形式。
内容的提问来源于stack exchange,提问作者71GA
相关产品推荐
相关产品推荐

