cmd = ''.join(['%s ' % c for c in commands]) proc = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=False, ).stdout
Гугл подсказал, что модуль subprocess в Python 2.7.х не умеет работать с юникодными строками. В качестве workaround (например тут и тут) предлагают использовать перекодирование в кодировку файловой системы:
fse = sys.getfilesystemencoding() cmd = ''.join(['%s ' % c.encode(fse) if isinstance(c, unicode) else c for c in commands]) proc = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=False, ).stdout
К сожалению, у меня этот трюк не сработал, точнее сработал как-то не так. Ошибка UnicodeEncodeError ушла, но пути стали «испорченными»: например было «D:\проба\relief.dat» стало «D:\i?iaa\relief.dat». При этом getfilesystemencoding() возвращает «mbcs». Чувствую, что упускаю какую-то мелочь из виду, но не могу сообразить какую именно.
Да, нужно кроссплатформенное и независимое от кодировок решение, которое будет работать и в Linux, и в Windows с любыми символами (кириллица, умляуты и т.д.). Python 2.7.х, перейти на тройку пока нет возможности.