Путь кодировки Unicode с кодировка файловой системы нарушает его [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть следующий путь в памяти:

video_path = u'C:\Documents and Settings\user\My Documents\Downloads\xf5iv - Neon Phoenix [Free DL].mp3'

Я пытаюсь использовать его в качестве параметра в cmd, поэтому я должен его закодировать.

video_path = video_path.encode(sys.getfilesystemencoding())
cmd = 'ffmpeg -y -i "%s" -vn -ac 2 -f mp3 audio.mp3' % video_path
subprocess.Popen(cmd)

Однако строка не кодируется правильным образом-она преобразует xf5 к ? вместо õ. Поэтому файл не удалось найти.

Как это может произойти? Я использую кодировку файловой системы по умолчанию (которая является mbcs).

3 2

3 ответа:

Из ответа здесь :

В Py3K-по крайней мере из "Python" 3.2 - подпроцесс.Попен и Сисс.аргв работа последовательно с (Unicode по умолчанию) str в Windows. CreateProcessW и GetCommandLineW используются явно.

В Python-до версии v2. 7. 2 по крайней мере-подпроцесс.Попен глючит с аргументы Юникода. Он прилипает к CreateProcessA (в то время как os.* АР согласуется с unicode). И шлекс.раскол создает дополнительную бессмыслицу. Pywin32 по win32process.CreateProcess также не автоматически переключается на W версия, также нет win32process.CreateProcessW. То же самое с GetCommandLine. Таким образом, под.уиндл.kernel32.CreateProcessW... нуждается в этом использовать. Модуль подпроцесса, возможно, должен быть исправлен относительно этого вопрос.

Поэтому subprocess.Popen не может обрабатывать unicode прямо на Python 2.X версий.

Моим решением было переименовать входной файл в нечто случайное (с помощью os.rename, которое поддерживает unicode), преобразовать с помощью ffmpeg, что я запускаю с subprocess.Popen, а затем переименовываю его обратно.

Попробуйте закодировать с помощью UTF-8:

video_path = video_path.encode("utf-8")

Если я не совсем ошибаюсь, двойная обратная косая черта в

video_path = u'C:...\\xf5iv...'

Вызывает проблему. Должно быть только одно:

video_path = u'C:...\xf5iv...'

В противном случае обратная косая черта сохраняется как обратная косая черта и оставляется для os.system(), а не для .encode(), чтобы иметь дело.