2012-03-30 20 views
5

Tengo un nombre de archivo Unicode que me gustaría abrir. El siguiente código:subproceso.Popen con una ruta Unicode

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

vuelve

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

a pesar de que no existe el archivo. ¿Por qué está pasando esto?

+0

Supongo que 'cmd' representa algo más? – brice

+0

Quité las comillas dobles, a pesar de que no están relacionadas con la pregunta. – iTayb

+0

¿Ha incluido la ruta de Python a su variable de entorno PATH? Suponiendo que su instalación de Python está en C: \ Python25, su nueva variable de ruta debería ser: % RUTA%; C: \ Python25 –

Respuesta

10

Parece que está usando Windows y Python 2.X. Utilice os.startfile:

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

no intuitivamente, conseguir la consola de comandos para hacer lo mismo que decir:

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

En mi sistema, la consola de comandos (cmd.exe) de codificación es cp437, pero para Los programas de Windows son cp1252. Popen comandos de shell deseados codificados como cp1252. Esto parece un error, y también parece estar solucionado en Python 3.X:

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

¡Gracias! No sabía acerca de 'os.startfile'. – iTayb

+0

En Windows en Python 2,' Popen (u'Pokémon.mp3'.encode (encoding)) 'funciona iff' Popen (u'Pokémon.mp3'.encode ('mbcs')) 'funciona es decir, debería tener éxito con 'cp1252' y debería fallar con' cp437' en su caso. ¿'shell = True' lo cambia? ¿Cuáles son los valores para' sys.getfilesystemencoding() 'y' locale.getpreferredencoding() '? En general, 'u" é "' podría no ser representable con 'mbcs'. Python 3 usa la API Unicode directamente. – jfs

+0

En Windows en python 2, si desea utilizar la línea de comandos Unicode (como python 3), puede usar [esta solución] (http://vaab.blog.kal.fr/2017/03/16/fixing-windows -python-2-7-unicode-issue-with-subprocesss-popen /) aprovechando '' ctypes'' para parchar '' subprocess.Popen (..) ''. – vaab

-2

Creo que Windows usa caracteres de 16 bits, no estoy seguro si es UCS2 o UTF16 o algo así. Así que supongo que podría tener un problema con UTF8.

+0

configurando como 'utf-16' devuelve 'TypeError: debe ser cadena sin bytes nulos o Ninguno, no str' así que supongo que eso está mal. – iTayb

2

Su problema se puede resolver mediante función smart_str del módulo Django.

Usar este código:

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) 

Puede encontrar información sobre cómo instalar Django en Windows here. primer lugar, puede instalar pip y luego se puede instalar Django iniciando una consola de comandos con privilegios de administrador y ejecute este comando:

pip install Django 

Esto instalará Django en el directorio site-packages de su instalación de Python.

+0

No instalaré un marco completamente nuevo solo para codificar unicode correctamente. la corrección debe ser de una o dos líneas de longitud, no más de 1000 de código complejo. – iTayb

+0

bien, lo siento, he actualizado mi respuesta.Quizás es más útil ahora. –

+0

Primero, la codificación 'latin-1' no es unicode. No funcionará con todos los casos Unicode. En segundo lugar, todavía no funciona. Inténtalo tú mismo. – iTayb

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

No hay necesidad de llamar a cmd si se utiliza el parámetro shell La forma correcta de poner en marcha un programa asociado es el uso del cmd start incorporada yo sepa.

Mi 2c, HIH.

+0

Gracias por la nota al margen, pero esto aún no soluciona el problema Unicode. Esto funciona en su sistema porque su configuración regional MBCS tiene el ó carbono. Este código no funcionará en computadoras que tengan hebreo o japonés como su idioma local. – iTayb

Cuestiones relacionadas