我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
columns = line.split(' ')
print (columns[3])
第3行出现错误,类型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行出现错误,类型Str不支持缓冲区API。
我做错了什么?我使用的是Python 3.3版本。
您正在读取二进制数据,而不是str
,因此您需要首先对输出进行解码。 如果将universal_newlines
参数设置为True
,则使用 locale.getpreferredencoding()
方法的结果(与打开文本文件相同)自动解码stdout
:
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])
Popen()
调用中使用显式的encoding
参数来指定不同的编解码器,例如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
,而是明确地从字节解码文本。
您试图使用str
参数拆分bytes
值:
>>> 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)
Popen
调用时传递 universal_newlines=True
参数。output = subprocess.check_output('dir', universal_newlines=True)
columns = output.split()
print(columns)
注意:如果文件或目录名包含空格,请使用os.listdir('.')
,如Martijn Pieters的答案中所建议的,或者类似以下内容的方法:
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)
.splitlines()
来处理带有空格的路径。 - jfs.splitlines()
,因为我的dir
版本(GNU coreutils 8.21)会产生多列输出。 - tjanezstdout=PIPE
),则dir
会产生单列输出。尝试在终端中输入dir | cat
以查看结果。 - jfsfrom binascii import b2a_uu
cmd = b2a_uu(subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE))