我有一个我要打开的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.
即使该文件确实存在。为什么会这样?
答案 0 :(得分:12)
看起来你正在使用Windows和Python 2.X.使用os.startfile:
>>> import os
>>> os.startfile(u'Pokémon.mp3')
非直觉地,让命令shell执行相同的操作是:
>>> import subprocess
>>> import locale
>>> subprocess.Popen(u'Pokémon.mp3'.encode(locale.getpreferredencoding()),shell=True)
在我的系统上,命令shell(cmd.exe)编码为cp437
,但对于Windows程序为cp1252
。 Popen
希望shell命令编码为cp1252
。这似乎是一个错误,它似乎也在Python 3.X中得到修复:
>>> import subprocess
>>> subprocess.Popen('Pokémon.mp3',shell=True)
答案 1 :(得分:2)
您的问题可以通过Django模块的 smart_str 功能解决。
使用此代码:
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)
您可以在Windows here上找到有关如何安装Django的信息。 您可以先安装pip,然后再开始安装Django 具有管理员权限的命令shell并运行此命令:
pip install Django
这将在您的Python安装的site-packages目录中安装Django。
答案 2 :(得分:-1)
>>> subprocess.call(['start', u'avión.mp3'.encode('latin1')], shell=True)
0
如果您使用cmd
参数,则无需致电shell
启动关联程序的正确方法是使用cmd的start
内置AFAIK。
我的2c,HIH。
答案 3 :(得分:-2)
我认为Windows使用16位字符,不确定它是UCS2还是UTF16或类似的东西。所以我猜它可能会出现UTF8问题。