Python2转Python3报TypeError: a bytes-like object is required, not 'str'问题咨询
错误原因
Python 3中subprocess.check_output默认返回bytes字节串类型,而非Python 2中的字符串类型。你直接对字节串使用字符串类型的'\n'做分割、用" :0"做包含判断,就会触发类型不匹配的报错。
解决方案
有两种常用的修复方式,都可以解决类型不匹配问题:
- 方案1:给
check_output指定编码参数,直接返回字符串类型结果(更推荐,后续无需额外类型转换) - 方案2:手动将返回的字节串解码为字符串
注意你最初写的列表推导式存在语法错误:
check_output("who".split('\n')括号位置错误,把split操作写到了check_output的参数内部,修正后已将split移到check_output调用的外部。
修正后的代码示例
循环版本
from subprocess import check_output graphical_users = [] # 方案1 加encoding参数 for line in check_output("who", encoding="utf-8").split('\n'): if " :0" in line: graphical_users.append(line.split()) # 方案2 手动decode(可选替换方案1的代码) # for line in check_output("who").decode("utf-8").split('\n'): # if " :0" in line: # graphical_users.append(line.split())
列表推导式版本
from subprocess import check_output # 方案1 加encoding参数 graphical_users = [line.split() for line in check_output("who", encoding="utf-8").split('\n') if " :0" in line] # 方案2 手动decode(可选替换方案1的代码) # graphical_users = [line.split() for line in check_output("who").decode("utf-8").split('\n') if " :0" in line]
内容的提问来源于stack exchange,提问作者Murphy's_Law_Personified
相关产品推荐
相关产品推荐

