Windows系统下如何正确使用subprocess.run配置路径?
解决Windows下Python subprocess.run找不到可执行文件的问题
你遇到的FileNotFoundError不是路径格式的问题——不管用不用r前缀,你的路径写法都是合法的。核心原因是subprocess.run的执行逻辑:cwd参数仅设置子进程的工作目录,不会让系统自动在该目录下搜索可执行文件。
下面是几种可行的解决方法:
方法一:指定可执行文件的完整路径
把工作目录和可执行文件名拼接成完整路径,直接作为subprocess.run的执行命令:
import os import subprocess # 目标程序所在目录 target_dir = r"C:/Program Files (x86)/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin" # 替换为实际的可执行文件名 exe_filename = "STM32CubeProgrammer.exe" # 拼接完整路径 full_exe_path = os.path.join(target_dir, exe_filename) # 执行命令,cwd可选,用于设置子进程的工作目录 result = subprocess.run(full_exe_path, cwd=target_dir)
方法二:临时将目标目录加入系统PATH
如果不想写完整路径,可以把目标目录临时添加到当前Python进程的PATH环境变量中,让系统能自动找到可执行文件:
import os import subprocess target_dir = r"C:/Program Files (x86)/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin" # 将目标目录追加到PATH末尾,os.pathsep是系统路径分隔符(Windows下为;) os.environ["PATH"] += os.pathsep + target_dir # 直接用可执行文件名执行 result = subprocess.run("STM32CubeProgrammer.exe")
这种修改仅对当前Python进程有效,不会改变系统全局的PATH设置。
方法三:使用shell=True(谨慎使用)
当设置shell=True时,Windows会通过cmd.exe执行命令,此时会在cwd指定的工作目录下搜索可执行文件:
import subprocess target_dir = r"C:/Program Files (x86)/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin" result = subprocess.run("STM32CubeProgrammer.exe", cwd=target_dir, shell=True)
⚠️ 注意:如果command包含用户输入的内容,shell=True可能导致命令注入攻击,非必要情况下不推荐使用。
补充说明
你之前用斜杠路径处理其他Windows路径正常,是因为那些场景(比如open()打开文件)是直接通过给定路径定位文件;而subprocess.run处理字符串形式的command时,会遵循系统的可执行文件搜索规则(优先查找PATH环境变量中的目录),两者的逻辑完全不同。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

