我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
columns = line.split(' ')
print (columns[3])
在第3行类型海峡错误犯规支持缓冲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行类型海峡错误犯规支持缓冲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)
注意 :如果文件或目录名称包含空格,使用os.listdir('.')
作为建议的Martijn皮特斯的答案或类似如下:
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)
更好地利用binascii.b2a_uu二进制数据转换为线的ASCII字符
from binascii import b2a_uu
cmd = b2a_uu(subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE))