0
0 комментариев

Пытаюсь реализовать взаимодействие со сторонней консольной утилитой: посылаю команды через stdin и читаю результат из stdout. Все это организовано через subprocess.Popen() и чтение/запись в соответствующие pipe’ы. Упрощенный код ниже

import subprocess
  command = ['/path/to/executable', 'arg1', 'arg2', 'arg3']
instance = subprocess.Popen(command,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.DEVNULL,
                            universal_newlines=True)
  # передаем данные и команду
instance.stdin.write('/path/to/data\n-command\n')
instance.stdin.flush()
  # читаем результат
instance.stdout.readlines()

В Linux и в MacOS все работает замечательно. А вот в Windows, если путь к файлу содержит кириллицу или какие-то другие, отличные от ASCII, символы, скрипт падает с ошибкой

UnicodeEncodeError: ‘charmap’ codec can’t encode characters in position 53-59: character maps to <undefined>

Как понимаю, это происходит из-за того, что используется universal_newlines=True и Python пытается сконвертировать данные в UTF-8 используя системную кодировку. Если системная кодировка (например, в англоязычной Windows) не содержит нужных символов, то получаем ошибку.

Убрал universal_newlines=True, передаю в stdin байты и, соответственно, декодирую байты, полученные из stdout. К сожалению, проблему это не решает.  На вход передаю путь ‘c:\\data\тестовый файл.dat’, после применения encode(‘utf-8′) получаю закодированные байты вида b’c:\\data\\\xd1\x82\xd0\xb5\xd1\x81\xd1\x82…’, которые консольное приложение не распознает как путь к файлу.

Подскажите, как можно передавать не только ASCII символы, независимо от того, какая локаль в системе? Везде используется Python 3.7.0 или выше.


Добавить комментарий