Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/88: Рейтинг темы: голосов - 88, средняя оценка - 4.92
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99

Кодировка stdout при работе с subprocess.Popen

23.11.2016, 16:33. Показов 18758. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня Виндоус, а следовательно кодировка комманд, выполняемых в cmd определяется локалью же, да?! Ну короче это cp1251. А вот кодировка python-ской консоли UTF-8 (скорее всего, весьма вероятно, так оно и есть).
Так вот. Все бы ничего, но понадобилось мне выполнить из питонки команду:
Bash
1
sc query type= service
Пишу следующий код (если что, Python 3.5):
Python
1
2
3
4
5
6
7
import subprocess as sub
 
child = sub.Popen(['sc', 'query'], stdout=sub.PIPE, shell=True, universal_newlines=True)
s = ' '
while s:
    s = child.stdout.readline()
    print(s)
И все бы ничего, только "кодировка сломалась", а как починить, не знаю.
Help me please

Добавлено через 1 час 57 минут
Покопал я значит сам Гуглы, по запускал разные варианты кода и выяснил, что мои бараны начинаются с IOBase. А уже где-то на уровне TextIOWrapper ударяются в воротаОКНА.
Да, когда я конструктору Popen скармливаю параметр universal_newlines=True, то возвращает он мне по вызову stdout экземпляр TextIOWrapper (ну а иначе как мне с трубой работать). А знаете, что это значит? - Оказывается, это значит (ну как я понял), что интерпретатор берет строку байт и декодирует ее автоматом под локаль системную. А еще это значит, что если параметр universal_newlines сделать False, то вернет интерпретатор мне IOBufferedReader, над которым потом Wraper и наворачивается. Так, а почему бы собственно не попробовать тогда сделать это вручную??? Пробую, и опять мажу:
Python
1
2
3
4
5
6
7
8
9
10
import subprocess as sub
import io
 
child = sub.Popen(['sc', 'query'], stdout=sub.PIPE, shell=True)
my_out = io.TextIOWrapper(child.stdout, encoding='utf8')
print(my_out)
s = ' '
while s:
     s = my_out.readline()
     print(s)
Получаю от-такой вывод:
<_io.TextIOWrapper name=3 encoding='utf8'>
Traceback (most recent call last):
File "D:/ProgrammingNI/workingDir/DaCIdA/checks_2.py", line 9, in <module>
s = my_out.readline()
File "C:\Program Files\Anaconda3\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 2: invalid start byte


Стоит мне поставить ручками ту же кодировку, что ставит интрепретатор автоматом, при использование параметра universal_newlines=True:
Python
1
my_out = io.TextIOWrapper(child.stdout, encoding='cp1251')
как тут-же возвращаюсь к все той-жу кракозябре:
<_io.TextIOWrapper name=3 encoding='cp1251'>


€¬п_б«г¦Ўл: AdobeARMservice

‚лў®¤Ё¬®Ґ_Ё¬п: Adobe Acrobat Update Service

’ЁЇ : 10 WIN32_OWN_PROCESS

‘®бв®п*ЁҐ : 4 RUNNING

(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
...

Ну плизики, NEED YOUR HELP

Добавлено через 50 минут
Парни, помогите, трахаюсь с кодировкой черт знает сколько. Вчера setlocale пробовал, и encode, и чот ваще не, потом вот, то что выше писал... Гугл внятного ответа не дает (ну либо я криворукий).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2016, 16:33
Ответы с готовыми решениями:

subprocess.Popen и stdin
Подскажите, пожалуйста, как вводить данные в stdin программы, запускаемой с помощью subprocess.Popen?

Как под Windows прокинуть файловые дескрипторы через os.system или subprocess.Popen ?
Товарищи. Во время портирования софта с юникса под винду возникла проблема... Чтобы я не перепробовал, файловые дескрипторы, открытые...

Как заставить subprocess.run(stdout=io.BytesIO() работать?
Что мне удалось найти по теме используя гугл: Раз, два В общем что у меня есть: import subprocess as sub import threading as...

3
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
23.11.2016, 16:52
cmd выдаёт текст в кодировке - cp866, посему
Python
1
my_out = io.TextIOWrapper(child.stdout, encoding='cp866')
или
Python
1
s = child.stdout.readline().decode('cp866')
1
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
24.11.2016, 12:19  [ТС]
Спасибо вам большое. Я совсем забыл про такую вещь, как cp866. Динозавр, перекочевавший к нас со времен псевдографики...
Раз уж написал на форум, то почему бы не задать еще вопрос... Я вот пытался список служб всех получить с их состояниями и прочей инфой о них. Решил, что запущу процесс CLI из Python-а, но были, в принципе, и другие варианты, например, попробовать заюзать какую-нибудь pywin32 (в ней пакет service utils)... В итоге имею, то, что имею. Список всех служб я получил, все ок. Но может есть и другие варианты.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import subprocess as sub
import io
from aste.processor import ASTEInterface
 
 
class SysServicesAnalyser(ASTEInterface):
 
    def withdraw(self):
        child = sub.Popen(['sc', 'query', 'type=', 'service', 'state=', 'all'], stdout=sub.PIPE, shell=True)
        my_out = io.TextIOWrapper(child.stdout, encoding='cp866')
        return my_out.read()
 
    def analise(self):
        pass
 
if __name__ == '__main__':
    pass
0
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
24.11.2016, 12:33  [ТС]
И ещё есть вот такая ошибка на компе моего знакомого. Хотя у меня все работает.

Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import sqlite3 as lite
 
_GET_TASK_TEMPLATE = """
SELECT ti.test_id
FROM test_info as ti
WHERE ti.check_id = {0}
"""
 
_GET_TEST_INIT_TEMPLATE = """
SELECT mi.module_id,
       mi.code_string
FROM module_info mi, test_info ti
WHERE mi.module_id = ti.module_id AND
      ti.test_id {0} {1}
"""
 
class ASTEManager():
    def __init__(self, task):
        self.con = lite.connect('database/ASTE.db')
        self.cur = self.con.cursor()
        self._test_tuple = tuple(i[0] for i in self._get_query(_GET_TASK_TEMPLATE, task))
        if len(self._test_tuple) <= 1:
            self._test_tuple = self._test_tuple[0]
            self._init_tuples = [i for i in self._get_query(_GET_TEST_INIT_TEMPLATE, '=', self._test_tuple)]
        else:
            self._init_tuples = [i for i in self._get_query(_GET_TEST_INIT_TEMPLATE, 'in', self._test_tuple)]
        self._init_dict = zip(self._test_tuple, self._init_tuples)
        self._execute()
 
    def _execute(self):
        for package_tuple in self._init_dict:
            name_components = package_tuple[1][1].split('.')
            test_construct = __import__(name_components[0])
            for com in name_components[1:]:
                test_construct = getattr(test_construct, com)
            con = lite.connect('database/ASTE.db')
            cur = con.cursor()
            test_object = test_construct(cur, package_tuple[0], package_tuple[1][0])  # !!!!!!!!!!!!!! IMPORTANT CODE
            # From this moment program cap, for check how manager works with functional modules
            # During under development!
            print('Test with id = {0} and init code {1} withdraw returns from system next data:\n{2}\n'.format(
                package_tuple[0], package_tuple[1][1], test_object.get_withdraw_data())
            )
            con.close()
 
 
    def _get_query(self, template, *data):
        _query = template.format(*data)
        self.cur.execute(_query)
        return self.cur.fetchall()
 
 
if __name__ == '__main__':
    ASTEManager(1)
Миниатюры
Кодировка stdout при работе с subprocess.Popen  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2016, 12:33
Помогаю со студенческими работами здесь

Неверная кодировка при работе с кириллицей
Вводится строка и каждый 2й '!' меняется на '$'. При вводе русских букв вместо их печатаются какието каракули,както данную проблему решить...

Неправильная кодировка при работе с MSSQL
Доброго времени суток. Надеюсь на Вашу помощь. Проблема следующая: операционная система MS Windows 2k Advanced Server, Apache 3.x, PHP 4.x,...

Lazarus и кодировка при работе с WinAPI
Перевожу программу по мониторингу печати с Delphi на Lazarus. Столкнулся с проблемой кодировки. вместо кириллицы отображаются ????????...

Кодировка в консоли при работе с jdbc. Windows 10
Здравствуйте! Наблюдается проблема с кодировкой при работе с jdbc. Как исправить проблему?

Кодировка кириллицы при работе с реестром Виндовс
Всем здравствуйте. procedure TForm1.Button1Click(Sender: TObject); var portname: string; reg: TRegistry; begin portname:=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru