Найти - Пользователи
Полная версия: Проблемы с кодировкой при получении результатов системных утилит
Начало » Python для новичков » Проблемы с кодировкой при получении результатов системных утилит
1
Stazot
Приветствую народ!! Прошу прощения если вдруг дублирую, но ничего вразумительного пока не нашёл, всё вокруг да около, но ничего не попадает. Начал изучать питон. Привлек тем что можно практически одинаковие скрипты писать и под Винду, и под “чертика ”, и под лини. Как раз стоит задача развертывания 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) тоже выдает ошибку
Может подскажете как избежать проблемы?
JOHN_16
Документация
Во первых, метод 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'
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB