subprocess.call()返回值存储异常:获取行数结果不符问题排查
问题原因分析
你碰到的问题核心在于**subprocess.call()返回的不是命令的输出内容**,而是命令执行的退出状态码——0代表命令执行成功,非0值才表示出错。所以你看到的7是wc -l的结果直接打印到了终端,而变量count拿到的是命令执行成功的状态码0,这就导致了和预期不符的结果。
解决方法
要捕获命令的输出并赋值给变量,得用subprocess模块中能获取输出的方法,下面给你两种实用方案:
方案1:使用subprocess.check_output()(Python2/3兼容)
这个方法会返回命令的标准输出内容,转成字符串后就能处理:
import subprocess # 捕获命令输出,注意转义引号 output = subprocess.check_output('ls -l | awk \'{print $1}\' | wc -l', shell=True) # 转成字符串并去除末尾换行符,再转成整数 count = int(output.strip()) print(count) # 此时会输出预期的7
方案2:使用subprocess.run()(Python3.5+官方推荐)
这是Python3.5之后官方主推的方式,功能更灵活可控:
import subprocess # 开启捕获输出、以文本格式返回结果 result = subprocess.run('ls -l | awk \'{print $1}\' | wc -l', shell=True, capture_output=True, text=True) # 从标准输出中提取内容,处理后转成整数 count = int(result.stdout.strip()) print(count)
额外建议
如果你的场景不需要依赖shell管道,其实可以用Python自身逻辑处理ls -l的输出,这样能避免shell注入的风险,代码也更易维护:
import subprocess # 直接执行ls -l,不通过shell ls_output = subprocess.check_output(['ls', '-l'], text=True) # 按行分割输出,统计行数(第一行是total,所以行数就是列表长度) rows = ls_output.strip().split('\n') count = len(rows) print(count) # 同样能得到7
内容的提问来源于stack exchange,提问作者Abhay Nayak
相关产品推荐
相关产品推荐

