Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2017 15:40:42

Stazot
Зарегистрирован: 2017-08-07
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с кодировкой при получении результатов системных утилит

Приветствую народ!! Прошу прощения если вдруг дублирую, но ничего вразумительного пока не нашёл, всё вокруг да около, но ничего не попадает. Начал изучать питон. Привлек тем что можно практически одинаковие скрипты писать и под Винду, и под “чертика ”, и под лини. Как раз стоит задача развертывания Zabbix и нужные параметры отсутствуют из коробки.(смарт, тепрература. по крайней мере 2 месяца назад. руки только доходят). И вот в чём проблема, то что возвращает subprocess.Pipe кракрзябры. метод detect() из библиотеки chardet ругается

 In [23]: proc = subprocess.Popen( args, stdout=subprocess.PIPE)
In [24]: s = str(proc.communicate())
In [47]: type (s)
Out[47]: str
In [48]: chardet.detect(s)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-48-740101961fc5> in <module>()
----> 1 chardet.detect(s)
c:\users\user\appdata\local\programs\python\python36\lib\site-packages\chardet\_
_init__.py in detect(byte_str)
     32         if not isinstance(byte_str, bytes):
     33             raise TypeError('Expected object of type bytes or bytearray,
 got: '
---> 34                             '{0}'.format(type(byte_str)))
     35         else:
     36             byte_str = bytearray(byte_str)
TypeError: Expected object of type bytes or bytearray, got: <class 'str'>
#способом ниже  получается избежать ошибки. но сам при этом перекодировать не получается. У винды вообще проблемы с консолью.  
In [42]: s2= s.encode()
In [43]: chardet.detect(s2)
Out[43]: {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}
In [44]: s2= s.encode('ascii').decode("utf-8")
In [45]: s2
Out[45]: "(b'\\x8d\\xa5\\xae\\xa1\\xe5\\xae\\xa4\\xa8\\xac\\xae \\xa7\\xa0\\xa4\
\xa0\\xe2\\xec \\xa7\\xad\\xa0\\xe7\\xa5\\xad\\xa8\\xa5 \\xaf\\xa0\\xe0\\xa0\\xa
c\\xa5\\xe2\\xe0\\xa0 -n 1.\\r\\n', None)"
Преобразование в строку путём str(s) тоже выдает ошибку
Может подскажете как избежать проблемы?

Офлайн

#2 Авг. 7, 2017 16:53:57

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Проблемы с кодировкой при получении результатов системных утилит

Документация
Во первых, метод communicate() возвращает кортеж из двух значений - а в вашем коде вы каким то образом привели его к строке - не нужно так делать
Во вторых, в зависимости от того в каком режиме были открыты потоки результат будет либо байты либо строки. В случае если строки - то они готовы что бы ими пользоваться. Если будут байты (а чаще всего так оно и есть), нужно привести их к строкам в соответсвии с нужной кодировкой.
Вот вам пример

 MacBook-Pro-Mahmudov:tmp john_16$ cat hello_ru.txt
Привет тебе мир!
MacBook-Pro-Mahmudov:tmp john_16$ python3
Python 3.5.1 (default, Apr 18 2016, 03:49:24)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess as sp
>>> outs, errs = sp.Popen('cat hello_ru.txt', shell=True, stdout=sp.PIPE).communicate()
>>> outs
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xb1\xd0\xb5 \xd0\xbc\xd0\xb8\xd1\x80!\n'
>>> result = outs.decode('utf-8')
>>> result
'Привет тебе мир!\n'
>>>



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version