Я запускаю инструмент командной строки, который возвращает цветной вывод (похожий на ls --color
). Я запускаю этот инструмент через subprocess
:
process = subprocess.run(['ls --color'], shell=True, stdout=subprocess.PIPE)
process.stdout.decode()
Но результат, конечно же, с цветовыми инструкциями типа \x1b[m\x1b[m
, что делает невозможным дальнейшую обработку вывода.
Как я могу удалить окраску и использовать чистый текст?
Подпроцесс работает? Вы спрашиваете об используемой кодовой странице в подпроцессе? В этом случае ctype — это путь для вашего изменения.
Да, результат есть, просто явно не правильно закодирован.
Перефразировал вопрос: Получается проблема с выводом цвета!
Ваш пример сработал для меня. Вы также можете открыть файл просто с помощью 'w'
и указать кодировку:
import subprocess
with open('output.txt', mode='w', encoding='utf-8') as file:
process = subprocess.run(['ls', '-l'], stdout=file)
Спасибо. Какую ОС вы используете? Может проблема в macOS?
Мои тесты были на Linux. Какой ответ вы получите, если сделаете import sys; sys.getdefaultencoding()
?
Перефразировал вопрос: Получается проблема с выводом цвета!
Я не могу воспроизвести проблему, даже если добавлю опцию --color
. Linux показывает цвет в терминале, но, похоже, удаляет его при передаче в канал подпроцесса Python. Это действительно просто ls
то, что вы делаете? Для этого есть команды Python без подпроцесса. Если вы делаете что-то еще с управляющими символами ASCII в выводе, я нашел этот ответ: stackoverflow.com/a/53965386/7721752 который может быть полезен.
Это работает на моей машине с 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
Зачем открывать в режиме 'wb'? Просто 'w' (т.е. текстовый режим) будет достаточно