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

STM32CubeProgrammer CLI通过Python subprocess调用失败原因咨询

Python调用subprocess执行STM32烧录命令失败的原因及解决办法

问题场景

手动在命令行执行以下命令可正常烧录STM32设备:

C:\location\bin>STM32_Programmer_CLI.exe -c port=COM1 -w C:\location\test.bin 0x08000000

但使用以下Python脚本调用subprocess.check_output时失败:

import os
import subprocess

#inputting commands when cli tool is running
connection = "C:\location\\bin>STM32_Programmer_CLI.exe"
subprocess.check_output([connection, '-c', '-c port=COM14' '-w C:\source\test.bin', '0x08000000'])

报错信息:

# Traceback (most recent call last):
# File "C:\source\q.py", line 14, in <module>
# subprocess.check_output([connection, '-c', '-c port=COM14' '-w C:\source\test.bin', '0x08000000'])
# File "C:\source\python_version\py3110\Lib\subprocess.py", line 466, in check_output
# return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
# #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# File "C:\source\python_version\py3110\Lib\subprocess.py", line 548, in run
# with Popen(*popenargs, **kwargs) as process:
# #          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# File "C:\source\python_version\py3110\Lib\subprocess.py", line 1024, in __init__
# self._execute_child(args, executable, preexec_fn, close_fds,
# File "C:\source\python_version\py3110\Lib\subprocess.py", line 1509, in _execute_child
# hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
# #                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

失败原因分析

  • 可执行文件路径错误:connection变量里包含了命令行提示符>,这不是程序路径的一部分,系统根本找不到这个"带提示符的程序"。正确的路径应该是C:\location\bin\STM32_Programmer_CLI.exe。
  • 参数拆分完全错误:subprocess的列表参数要求每个命令参数都是独立的列表元素。比如-c port=COM14要拆成'-c'和'port=COM14'两个元素,-w C:\source\test.bin要拆成'-w'和'C:\source\test.bin'。原代码不仅没拆分,还把'-c port=COM14'和'-w...'连写(少了逗号),导致这俩字符串被拼接成一个无效参数,直接乱套。
  • 路径转义问题:Windows路径里的反斜杠要么用\\转义,要么用原始字符串(加r前缀),不然\l、\s这类字符会被Python解析成转义序列,导致路径实际指向错误的位置。

修正后的代码

import subprocess

# 用原始字符串避免转义问题,去掉多余的命令行提示符>
cli_executable = r"C:\location\bin\STM32_Programmer_CLI.exe"

# 严格按照命令参数拆分,每个参数单独作为列表元素
output = subprocess.check_output([
    cli_executable,
    '-c', 'port=COM14',
    '-w', r'C:\source\test.bin',
    '0x08000000'
])

# 可选:打印命令执行后的输出内容
print(output.decode('utf-8'))

内容的提问来源于stack exchange,提问作者mm-05

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:05:33