Форум сайта python.su
0
Приветствую народ!! Прошу прощения если вдруг дублирую, но ничего вразумительного пока не нашёл, всё вокруг да около, но ничего не попадает. Начал изучать питон. Привлек тем что можно практически одинаковие скрипты писать и под Винду, и под “чертика ”, и под лини. Как раз стоит задача развертывания 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)"
Офлайн
221
Документация
Во первых, метод 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' >>>
Офлайн