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

Python使用subprocess执行shell命令报FileNotFoundError问题求助

报错原因

  • 首次FileNotFoundError:未配置shell=True时,subprocess.Popen会将传入的完整命令字符串整体作为可执行文件名查找,而非解析为命令+参数,因此找不到对应文件。同时原始代码存在笔误:p8 = subprocess.Popen('sort', stdin=p8.stdout, stdout=subprocess.PIPE) 引用了未初始化的p8.stdout,最后print(p01.communicate())调用了不存在的p01变量。
  • 修改后命令用法报错:shell=True时传入列表格式的命令,只有列表第一个元素会被作为shell命令执行,后续元素都会被识别为shell的位置参数,而非当前命令的参数,导致grep、cut等命令未拿到正确参数触发用法提示。另外参数中额外添加的单/双引号属于shell转义语法,直接写入Python列表会被识别为参数内容的一部分,导致命令匹配逻辑异常。

解决方案

两种实现方式二选一即可:

方式1:字符串命令+shell=True

直接写完整shell命令字符串,无需拆分列表,同时修正原笔误和管道死锁问题:

import subprocess

p1 = subprocess.Popen('cat output3.txt', stdout=subprocess.PIPE, shell=True)
p2 = subprocess.Popen('sed s/\"/ /g', stdin=p1.stdout, stdout=subprocess.PIPE, shell=True)
p1.stdout.close()
p3 = subprocess.Popen('grep "sO"', stdin=p2.stdout, stdout=subprocess.PIPE, shell=True)
p2.stdout.close()
p4 = subprocess.Popen('grep -v "get"', stdin=p3.stdout, stdout=subprocess.PIPE, shell=True)
p3.stdout.close()
p5 = subprocess.Popen('cut -d \',\' -f2', stdin=p4.stdout, stdout=subprocess.PIPE, shell=True)
p4.stdout.close()
p6 = subprocess.Popen('sed s/\"//g', stdin=p5.stdout, stdout=subprocess.PIPE, shell=True)
p5.stdout.close()
p7 = subprocess.Popen('sort', stdin=p6.stdout, stdout=subprocess.PIPE, shell=True)
p6.stdout.close()
p8 = subprocess.Popen('uniq -c', stdin=p7.stdout, stdout=subprocess.PIPE, shell=True)
p7.stdout.close()
p9 = subprocess.Popen('sort -nr', stdin=p8.stdout, stdout=subprocess.PIPE, shell=True)
p8.stdout.close()
p0 = subprocess.Popen('head -10', stdin=p9.stdout, stdout=subprocess.PIPE, shell=True)
p9.stdout.close()

print(p0.communicate())

方式2:列表参数+无shell=True(安全性更高,无shell注入风险)

拆分命令和参数,不需要额外添加shell转义用的引号:

import subprocess

p1 = subprocess.Popen(['cat', 'output3.txt'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['sed', 's/"/ /g'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p3 = subprocess.Popen(['grep', 'sO'], stdin=p2.stdout, stdout=subprocess.PIPE)
p2.stdout.close()
p4 = subprocess.Popen(['grep', '-v', 'get'], stdin=p3.stdout, stdout=subprocess.PIPE)
p3.stdout.close()
p5 = subprocess.Popen(['cut', '-d', ',', '-f2'], stdin=p4.stdout, stdout=subprocess.PIPE)
p4.stdout.close()
p6 = subprocess.Popen(['sed', 's/"//g'], stdin=p5.stdout, stdout=subprocess.PIPE)
p5.stdout.close()
p7 = subprocess.Popen(['sort'], stdin=p6.stdout, stdout=subprocess.PIPE)
p6.stdout.close()
p8 = subprocess.Popen(['uniq', '-c'], stdin=p7.stdout, stdout=subprocess.PIPE)
p7.stdout.close()
p9 = subprocess.Popen(['sort', '-nr'], stdin=p8.stdout, stdout=subprocess.PIPE)
p8.stdout.close()
p0 = subprocess.Popen(['head', '-10'], stdin=p9.stdout, stdout=subprocess.PIPE)
p9.stdout.close()

print(p0.communicate())

内容的提问来源于stack exchange,提问作者Tech Geek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:03