Подпроцесс stdout без цветов

Я запускаю инструмент командной строки, который возвращает цветной вывод (похожий на ls --color). Я запускаю этот инструмент через subprocess:

process = subprocess.run(['ls --color'], shell=True, stdout=subprocess.PIPE)
process.stdout.decode()

Но результат, конечно же, с цветовыми инструкциями типа \x1b[m\x1b[m, что делает невозможным дальнейшую обработку вывода.

Как я могу удалить окраску и использовать чистый текст?

Зачем открывать в режиме 'wb'? Просто 'w' (т.е. текстовый режим) будет достаточно

Pingu 03.02.2023 18:18

Подпроцесс работает? Вы спрашиваете об используемой кодовой странице в подпроцессе? В этом случае ctype — это путь для вашего изменения.

Hermann12 03.02.2023 18:26

Да, результат есть, просто явно не правильно закодирован.

Michael Dorner 03.02.2023 20:30

Перефразировал вопрос: Получается проблема с выводом цвета!

Michael Dorner 04.02.2023 11:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш пример сработал для меня. Вы также можете открыть файл просто с помощью 'w' и указать кодировку:

import subprocess

with open('output.txt', mode='w', encoding='utf-8') as file:
    process = subprocess.run(['ls', '-l'], stdout=file)

Спасибо. Какую ОС вы используете? Может проблема в macOS?

Michael Dorner 03.02.2023 20:27

Мои тесты были на Linux. Какой ответ вы получите, если сделаете import sys; sys.getdefaultencoding()?

ukBaz 03.02.2023 21:53

Перефразировал вопрос: Получается проблема с выводом цвета!

Michael Dorner 04.02.2023 11:20

Я не могу воспроизвести проблему, даже если добавлю опцию --color. Linux показывает цвет в терминале, но, похоже, удаляет его при передаче в канал подпроцесса Python. Это действительно просто ls то, что вы делаете? Для этого есть команды Python без подпроцесса. Если вы делаете что-то еще с управляющими символами ASCII в выводе, я нашел этот ответ: stackoverflow.com/a/53965386/7721752 который может быть полезен.

ukBaz 04.02.2023 13:34
Ответ принят как подходящий

Это работает на моей машине с win10 и python 3.11. Ваша команда работает без проблем: В моей IDE я не вижу цвета, но эта команда тоже работает subprocess.run(["ls", "--color=none"], shell=True, stdout=subprocess.PIPE).

Действительные аргументы на моей машине:

  • «никогда», «нет», «никто»
  • «авто», «телефон», «если-терминал»
  • 'всегда', 'да', 'сила'

Код:

import subprocess

process = subprocess.run(["ls", "-la"], shell=True, stdout=subprocess.PIPE)

with open("dirList.txt", 'w') as f:
    f.write(process.stdout.decode())

Выход: всего 14432

drwxr-xr-x 1 Hermann Hermann       0 Nov 19 08:00 .
drwxr-xr-x 1 Hermann Hermann       0 Aug 28  2021 ..
-rw-r--r-- 1 Hermann Hermann       0 Jan 28 09:25 .txt
-rw-r--r-- 1 Hermann Hermann    1225 Jan  6 00:51 00_Template_Program.py
-rw-r--r-- 1 Hermann Hermann     490 Jan 15 23:33 8859_1.py
-rw-r--r-- 1 Hermann Hermann     102 Jan 15 23:27 8859_1.xml

Другие вопросы по теме