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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:01