Python:使用子进程运行CMD,用于刷新stm32 uC



我在通过python脚本刷新stm32时遇到了一些麻烦。我正在使用ST Link Utility工具提供的ST-LINK_CLI.exe来刷新uC,它通过使用Windows中的CMD工作,但不能通过python工具工作。

我从subprocess.run(...(返回的错误是"无法打开文件!"对于我提供的路径,但相同的路径在Windows的CMD中工作正常。

import subprocess
path = 'C:/Users/U1/Desktop/test.hex'
path = path.encode('utf-8')
stlink_output=[]
try:
stlink_output = subprocess.run(
["ST-LINK_CLI.exe", "-c", "ID=0", "SWD", "-P", str(path), "-V", "-HardRST", "-Rst"],
check=False,
stdout=subprocess.PIPE).stdout.decode().splitlines()
except:
print("An error occured")
print(stlink_output)

有没有人知道,提供的路径会有什么问题?我应该使用不同的编码吗?

你没有解码你的路径,只是将你的字节转换为字符串,所以你得到一个路径,比如

"b'C:/Users/U1/Desktop/test.hex'"

尝试解码以获得正确的字符串

stlink_output = subprocess.run( ["ST-LINK_CLI.exe", "-c", "ID=0", "SWD", "-P", path.decode(), "-V", "-HardRST", "-Rst"], check=False, stdout=subprocess.PIPE).stdout.decode().splitlines()

如果您确定输出值是文本,请考虑使用runtext=True参数(如果需要,可以encoding(。

只需将路径定义为字符串并使用它(无需编码/解码(。

同样对于python 3.4+,建议使用pathlib模块(允许稍后在您的代码中进行整洁的检查和用户扩展(。 因此,代码将如下所示:

import subprocess
import pathlib
# `~` gets converted to current user home with expanduser()
# i.e. `C:/Users/U1` in Your case
path = pathlib.Path('~/Desktop/test.hex').expanduser()
if not path.exists():
raise FileNotFoundError(path)
stlink_output = subprocess.run(
["ST-LINK_CLI.exe", "-c", "ID=0", "SWD", "-P", path, "-V", "-HardRST", "-Rst"],
check=False,
# text option without decoding requires py3.7+...
# text=True,
# stdout=subprocess.PIPE).stdout.splitlines()
# ...so this is variant pre python3.7:
stdout=subprocess.PIPE).stdout.decode().splitlines()
print(stlink_output)

最新更新