Подпроцесс украшателя вывода 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
. GNUls
использует колонки переменной ширины для отображения как можно большего количества файлов в наименьшем количестве строк.
(выделено жирным шрифтом)
Это означает, что в зависимости от самого длинного имени файла ширина колонок регулируется, и количество колонок может меняться. Но при этом используется 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.