我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
columns = line.split(' ')
print (columns[3])
第 3 行有错误 Type Str 不支持缓冲区 API。
我在做错什么我在 Python 3.3 上
我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
columns = line.split(' ')
print (columns[3])
第 3 行有错误 Type Str 不支持缓冲区 API。
我在做错什么我在 Python 3.3 上
您正在读取二进制数据,而不是str
,因此您需要先解码输出。如果将universal_newlines
参数设置为True
,则使用方法stdout
的结果自动解码
(与打开文本文件相同):locale.getpreferredencoding()
cmd = subprocess.Popen(
'dir', shell=True, stdout=subprocess.PIPE, universal_newlines=True)
for line in cmd.stdout:
columns = line.decode().split()
if columns:
print(columns[-1])
如果您使用 Python 3.6 或更新版本,您可以使用显式encoding
参数Popen()
调用来指定要使用的不同编解码器,例如 UTF-8:
cmd = subprocess.Popen(
'dir', shell=True, stdout=subprocess.PIPE, encoding='utf8')
for line in cmd.stdout:
columns = line.split()
if columns:
print(columns[-1])
如果您需要在 Python 3.5 或更早版本中使用不同的编解码器,请不要使用universal_newlines
,只需显式解码字节中的文本。
您试图bytes
使用str
参数拆分值:
>>> b'one two'.split(' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Type str doesn't support the buffer API
通过解码,您可以避免该问题,并且您的print()
调用不必在输出前加上b'..'
任何一个。
但是,您可能只想使用该os
模块来获取文件系统信息:
import os
for filename in os.listdir('.'):
print(filename)
Martijn Pieters 答案第一部分的一个更简单的解决方案是将universal_newlines=True
参数传递给Popen
调用。
我什至会将其简化为:
output = subprocess.check_output('dir', universal_newlines=True)
columns = output.split()
print(columns)
注意:如果文件或目录名称包含空格,请按照Martijn Pieters 的回答os.listdir('.')
中的建议使用或类似以下内容:
output = subprocess.check_output('dir', universal_newlines=True)
columns = []
for e in output.split():
if len(columns) > 0 and columns[-1].endswith('\\'):
columns[-1] = columns[-1][:-1] + " " + e
else:
columns.append(e)
print(columns)
最好使用将二进制数据转换为一行 ASCII 字符的binascii.b2a_uu
from binascii import b2a_uu
cmd = b2a_uu(subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE))