Печатает ли подпроцесс Python раскрашенные выходные данные?

#python #subprocess #alias #ls

Вопрос:

Я работаю над индивидуальной версией ls . В этой настроенной версии, называемой lf (list fancy), я просто создал псевдоним ls с флагами -AbcFghkLst . Тем не менее, я хочу получить от этого больше функциональности, не запоминая, что делает каждый флаг. Например, lf -n будет сортироваться по имени или lf -c по времени создания. Чтобы решить эту задачу, я использую argparse для флагов.

В этом и заключается проблема. Псевдоним lf вызывает ls и выводит раскрашенные выходные данные на консоль. subprocess.run() выводит мягкий вывод на консоль. Есть ли способ передать раскрашенный вывод через subprocess.run() ? Если нет, то есть ли способ добавить поведение флага lf ?

Вот пример текущего кода.

 import argparse
import subprocess

parser = argparse.ArgumentParser(description='A fancy version of ls')
group = parser.add_mutually_exclusive_group(required=False)
group.add_argument('-n', '--name', action='store_true', help='Sort entries by name')
group.add_argument('-c', '--created', action='store_true', help='Sort entries by creation date')

args = parser.parse_args()

ls = ['ls']

flags = '-AbcFghkLs'  # Desired output before sorting flag.

if args.name:
    flags  = 'l'
    ls.extend([flags])

elif args.created:
    ls.extend([flags])

else:
    ls.extend(['-AbcFghkLst'])
    
subprocess.run(ls)
 

И вот как это выглядит в настоящее время после выполнения.
Первый lf является псевдонимом команды unix, а вторая команда вызывает ls из скрипта Python. Обратите внимание на изменение цвета каталога между ними.

Комментарии:

1. Без --color аргумента ls не окрашивает вывод. (Я подозреваю, что ваш lf псевдоним соединяется с другим псевдонимом, который использует --color аргумент.)

2. Я удивлен, что пропустил это, просматривая документацию. Однако после тестирования я не могу передать -- аргументы ls . Я понял ошибку ls: illegal option -- - . Я также понял, что ls это псевдоним, к ls -G которому добавляется цвет, но я не понимаю, почему.

3. Какова полная команда, которая генерирует эту ошибку?

4. ls --color=always генерирует эту ошибку. Я также подумал --group-directories-first , что было бы неплохо, но этот флаг вызывает ту же ошибку.

5. На macOS Catalina действительно нет опций с двойным тире. -G это вариант цвета. Я предполагаю, что Биг Сур-то же самое.