2012-03-30 12 views
5

Ho un nome file unicode che vorrei aprire. Il seguente codice:subprocess.Popen con un percorso unicode

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

rendimenti

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

anche se il file esistono. Perché sta succedendo?

+0

Mi sembra che "cmd" rimanga per qualcos'altro? – brice

+0

Ho rimosso le virgolette, anche se non sono correlate alla domanda. – iTayb

+0

Hai incluso il percorso Python nella variabile di ambiente PATH? Supponendo che l'installazione di Python sia in C: \ Python25, la nuova variabile percorso dovrebbe essere: % PATH%; C: \ Python25 –

risposta

10

Sembra che tu stia usando Windows e Python 2.X. Utilizzare os.startfile:

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

non intuitivo, ottenendo la shell dei comandi per fare la stessa cosa è:

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

Sul mio sistema, la shell di comando (cmd.exe) codifica è cp437, ma per I programmi Windows sono cp1252. Popen voleva comandi shell codificati come cp1252. Questo sembra un bug, e sembra anche risolto in Python 3.X:

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

Grazie! 'os.startfile'. – iTayb

+0

Su Windows su Python 2,' Popen (u'Pokémon.mp3'.encode (encoding)) 'funziona iff' Popen (u'Pokémon.mp3'.encode ('mbcs')) 'funziona cioè, dovrebbe avere successo con 'cp1252' e non dovrebbe funzionare con' cp437' nel tuo caso. 'shell = True' lo cambia? Quali sono i valori per' sys.getfilesystemencoding() 'e' locale.getpreferredencoding() '? In generale, 'u" é "' potrebbe non essere rappresentabile usando 'mbcs'. Python 3 usa direttamente l'API Unicode. – jfs

+0

Su windows su python 2, se vuoi usare la riga di comando unicode (come python 3), puoi usare [questa soluzione] (http://vaab.blog.kal.fr/2017/03/16/fixing-windows -python-2-7-unicode-issue-with-subprocesss-popen /) sfruttando '' ctypes'' per correggere '' subprocess.Popen (..) ''. – vaab

-2

Penso che Windows usi caratteri a 16 bit, non è sicuro se sia UCS2 o UTF16 o qualcosa del genere. Quindi immagino che potrebbe avere un problema con UTF8.

+0

impostazione come 'utf-16' restituisce 'TypeError: deve essere una stringa senza byte nulli o None, non str' quindi immagino che sia sbagliato. – iTayb

2

Il tuo problema può essere risolto tramite la funzione smart_str del modulo Django.

di questo codice:

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) 

È possibile trovare informazioni su come installare Django su Windows here. È prima possibile installare pip e quindi è possibile installare Django avviando una shell dei comandi con privilegi di amministratore ed eseguire questo comando:

pip install Django 

Questo installerà Django nella directory site-packages di vostra installazione di Python.

+0

Non installerò un framework completamente nuovo solo per codificare unicode correttamente. la correzione dovrebbe essere lunga una o due righe, non 1000+ di codice complesso. – iTayb

+0

ok, mi dispiace, ho aggiornato la mia risposta.Forse è più utile ora. –

+0

Innanzitutto, la codifica 'latin-1' non è unicode. Non funzionerà con tutti i casi Unicode. In secondo luogo, non funziona ancora. Prova tu stesso. – iTayb

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

Non c'è bisogno di chiamare cmd se si utilizza il parametro shell Il modo corretto per lanciare un programma associato è quello di utilizzare il cmd start built-in per quanto ne so.

My 2c, HIH.

+0

Grazie per la nota a margine, ma questo non risolve ancora il problema Unicode. Funziona sul tuo sistema perché il tuo locale MBCS ha il carattere 0. Questo codice non funzionerà su computer che hanno l'ebraico o il giapponese come lingua locale. – iTayb

Problemi correlati