Ответ 1
Вы читаете двоичные данные, а не 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)