подпроцесс.Popen с путем unicode

у меня есть имя файла unicode, которое я хотел бы открыть. Следующий код:

cmd = u'cmd /c "C:Pokxe9mon.mp3"'
cmd = cmd.encode('utf-8')
subprocess.Popen(cmd)

возвращает

>>> 'C:Pokיmon.mp3' is not recognized as an internal or external command, operable program or batch file.

даже если файл не существует. Почему это происходит?

4 ответов


похоже, вы используете Windows и Python 2.Используйте Х. os.startfile:

>>> import os
>>> os.startfile(u'Pokémon.mp3')

не интуитивно, получение командной оболочки, чтобы сделать то же самое:

>>> import subprocess
>>> import locale
>>> subprocess.Popen(u'Pokémon.mp3'.encode(locale.getpreferredencoding()),shell=True)

в моей системе командная оболочка (cmd.exe) кодировка cp437, но для программ Windows это cp1252. Popen wanted команды оболочки закодированы как cp1252. Это похоже на ошибку, и она также кажется исправленной в Python 3.X:

>>> import subprocess
>>> subprocess.Popen('Pokémon.mp3',shell=True)

ваша проблема может быть решена с помощью smart_str функция модуля Django.

используйте этот код:

from django.utils.encoding import smart_str, smart_unicode
cmd = u'cmd /c "C:\Pok\xe9mon.mp3"'
smart_cmd = smart_str(cmd)
subprocess.Popen(smart_cmd)

Вы можете найти информацию о том, как установить Django на Windows здесь. Вы можете сначала установить Пип и затем вы можете установить Django, запустив командную строку с правами администратора и выполните следующую команду:

pip install Django

это установит Django на сайт-пакеты вашей установки Python справочник.


>>> subprocess.call(['start', u'avión.mp3'.encode('latin1')], shell=True)
0

нет необходимости звонить cmd Если вы используете


Я думаю, что windows использует 16-битные символы, не уверен, что это UCS2 или UTF16 или что-то в этом роде. Поэтому я думаю, что у него может быть проблема с UTF8.