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
相关产品推荐
相关产品推荐

