подпроцесс. Открыть с помощью пути Unicode - PullRequest
7 голосов
/ 30 марта 2012

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

cmd = u'cmd /c "C:\\Pok\xe9mon.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 ]

12 голосов
/ 31 марта 2012

Похоже, вы используете Windows и Python 2.X.Используйте 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 нужны команды оболочки, закодированные как cp1252.Это похоже на ошибку, и это также исправлено в Python 3.X:

>>> import subprocess
>>> subprocess.Popen('Pokémon.mp3',shell=True)
2 голосов
/ 30 марта 2012

Ваша проблема может быть решена с помощью функции 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 здесь .Сначала вы можете установить pip , а затем установить Django, запустив командную оболочку с правами администратора и выполнив следующую команду:

pip install Django

Это установит Django в пакеты сайтов вашей установки Python.каталог.

0 голосов
/ 30 марта 2012
>>> subprocess.call(['start', u'avión.mp3'.encode('latin1')], shell=True)
0

Нет необходимости вызывать cmd, если вы используете параметр shell. Правильный способ запуска связанной программы - использовать встроенный AFAIK cmd's start.

My2c, HIH.

0 голосов
/ 30 марта 2012

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

...