Подпроцесс украшателя вывода Python

Здравствуйте, я использую subprocess.

import subprocess

proc = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
output = proc.stdout.read()
print(output)

вывод корректен

b'file.txt\nmain.py\nsource\ntest-page\n'

есть ли способ украсить его, как в linux server?

root@master:/home/python# ls
file.txt  main.py  source  test-page

Используйте split() по новой строке для получения файлов, затем выведите каждый на отдельной строке:

lines = output.split(b'\n')

for line in lines:
    print(line.decode())

печатает каждый файл на отдельной строке:

file.txt  
main.py  
source  
test-page

Вы можете использовать

print(output.decode().rstrip().replace("\n", " " * 2))
file.txt   main.py   source   test-page
  • decode() - это преобразование байтов в строку
  • rstrip() удаляет последнюю бегущую строку "\n", но это необязательно
  • replace("\n", " " * 2)) заменит "\n" (символ новой строки) на 2 пробела

Фоновый вертикальный формат, используемый ls

Терминал использует вывод в виде столбцов, разделенных пробелами, см. Документацию GNU по ls:

‘--format=vertical’

Перечисление файлов в столбцах, отсортированных по вертикали, без какой-либо другой информации. Это значение по умолчанию для ls, если стандартный вывод - это терминал. Это всегда значение по умолчанию для программы dir. GNU ls использует колонки переменной ширины для отображения как можно большего количества файлов в наименьшем количестве строк.

(выделено жирным шрифтом)

Это означает, что в зависимости от самого длинного имени файла ширина колонок регулируется, и количество колонок может меняться. Но при этом используется 2 пробела между колонками.

Simple

Простое разделение двух пространств может быть достигнуто str.replace().

output = b'file.txt\nmain.py\nsource\ntest-page'
vertical = output.decode().replace('\n', ' ' * 2)
print(vertical)

Prints:

file.txt  main.py  source  test-page

Columnar

С этой задачей может справиться какая-нибудь продвинутая библиотека, например columnar.

Вернуться на верх