Python 3.9.2使用subprocess.call调用外部命令报FileNotFoundError
报错根本原因
ls是类Unix(Linux、macOS)系统的原生命令,Windows原生不存在名为ls.exe的可执行执行文件- 部分用户看到Windows终端输入
ls能返回结果,这是PowerShell提供的命令别名效果,不是系统真的生成了ls可执行程序;subprocess模块默认是直接调用系统CreateProcess接口启动可执行文件,不会经过PowerShell的别名解析逻辑,自然检索不到对应的ls程序 - 即使换成Windows原生的内置命令(比如
dir),如果这类命令没有独立的exe实体文件,subprocess默认的调用方式也会因为找不到可执行文件报错
对应解决方法
- 方案1:直接替换为Windows原生命令实现等价功能
如果需要实现类ls -l的列目录效果,调用Windows自带的dir命令,因为dir是cmd的内置命令,需要搭配shell=True参数才能正常运行,示例代码:from subprocess import call call("dir", shell=True) - 方案2:需要保留
ls命令调用能力的场景
如果本机安装了Git Bash、WSL、Cygwin等类Unix兼容环境,可以直接传入ls.exe的完整绝对路径调用,不需要开启shell=True参数,示例代码:from subprocess import call # 替换为你本机实际的ls.exe存储路径 call([r"C:\Program Files\Git\usr\bin\ls.exe", "-l"]) - 通用排查规则(其他同类FileNotFoundError报错可参考)
- 确认要调用的目标程序是真实存在的独立可执行文件,且文件路径在系统PATH环境变量配置中
- 如果要调用的是cmd/PowerShell的内置命令(无独立exe实体),必须给subprocess的调用方法加上
shell=True参数,否则会因为检索不到同名可执行文件触发报错
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

