Путь кодировки 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 ответа:
Из ответа здесь :
В 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
, а затем переименовываю его обратно.
Если я не совсем ошибаюсь, двойная обратная косая черта в
video_path = u'C:...\\xf5iv...'
Вызывает проблему. Должно быть только одно:
video_path = u'C:...\xf5iv...'
В противном случае обратная косая черта сохраняется как обратная косая черта и оставляется для
os.system()
, а не для.encode()
, чтобы иметь дело.