Python调用subprocess.run执行命令触发FileNotFoundError如何解决
Python subprocess.run 执行命令报错解决方案
错误根因
你遇到的报错是几个原因共同导致的:
echo属于shell内置命令,不是系统中独立存在的可执行文件,subprocess.run默认不会通过shell环境加载命令,因此找不到对应执行程序- 你实际执行的命令用到了
&&这类shell专属语法,默认模式下无法解析这类语法 - 用列表形式传参时额外加的引号是多余的,
subprocess会自动处理参数转义,额外加的引号会被当作参数内容的一部分传递
解决方案
方案1:开启shell模式(适合使用内置命令、shell语法的场景)
如果需要使用echo这类内置命令,或者用到&&、管道、重定向等shell语法,添加shell=True参数即可,示例代码如下:
import subprocess import os # 请替换为你实际要切换的目标目录 directory = "/path/to/your/target/directory" # 提前校验目录存在,避免cwd参数本身触发找不到文件的报错 if not os.path.isdir(directory): raise ValueError(f"指定的工作目录{directory}不存在") result = subprocess.run( 'echo "blah" && ls -la', cwd=directory, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # 该参数会自动将输出转成字符串,无需手动decode )
方案2:避免使用shell特性(适合有安全要求的场景)
shell=True 存在命令注入风险(如果命令包含用户输入内容时),如果不需要用到shell专属特性,可以替换内置命令为Python原生逻辑,调用独立可执行文件时用列表传参:
import subprocess import os directory = "/path/to/your/target/directory" if not os.path.isdir(directory): raise ValueError(f"指定的工作目录{directory}不存在") # 用Python原生print代替echo内置命令 print("blah") # 调用独立可执行文件ls,不需要开启shell result = subprocess.run( ["ls", "-la"], cwd=directory, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True )
结果获取方式
- 命令返回码:
result.returncode,返回0代表执行成功,非0代表执行异常 - 标准输出内容:
result.stdout - 标准错误内容:
result.stderr
注意事项
cwd参数只会影响本次subprocess.run执行命令的工作目录,不会修改Python脚本本身的工作目录,符合你仅在命令运行期间切换目录的需求- 除非明确需要shell语法,否则优先使用列表传参+默认
shell=False的模式,安全性更高
内容的提问来源于stack exchange,提问作者Qrashi
相关产品推荐
相关产品推荐

