subprocess.Popen使用unicode路径

时间:2012-03-30 10:15:09

标签: python windows unicode command-line subprocess

我有一个我要打开的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 个答案:

答案 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程序为cp1252Popen希望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问题。