python - subprocess.Popen med en unicode sti

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et unicode-filnavn, som jeg gerne vil åbne.
Følgende kode:


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


vender tilbage


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


selv om filen eksisterer. Hvorfor sker det her?

Bedste reference


Det ser ud til at du bruger Windows og Python 2.X. Brug os.startfile: [16]


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


Ikke-intuitivt, at få kommandoen skal til at gøre det samme er:


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


På mit system er kommandoen shell (cmd.exe) kodning cp437, men for Windows-programmer er cp1252. Popen ønskede shell kommandoer kodet som cp1252. Dette virker som en fejl, og det synes også at være fast i Python 3.X:


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

Andre referencer 1


Dit problem kan løses gennem smart\_str funktionen af ​​Django-modulet.


Brug denne kode:


from django.utils.encoding import smart\_str, smart\_unicode
cmd = u'cmd /c "C:\Pokxe9mon.mp3"'
smart\_cmd = smart\_str(cmd)
subprocess.Popen(smart\_cmd)


Du kan finde oplysninger om, hvordan du installerer Django på Windows her.
Du kan først installere pip og så kan du installere Django ved at starte
en kommando skal med administratorrettigheder og køre denne kommando: [17]


pip install Django


Dette vil installere Django i din Python installation s site-pakker mappe.

Andre referencer 2


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


Der er ingen grund til at ringe cmd, hvis du bruger parametre shell
Den korrekte måde at starte et tilknyttet program på er at bruge cmd'ens start indbyggede AFAIK.


Min 2c, HIH.

Andre referencer 3


Jeg tror, ​​at Windows bruger 16-bit tegn, ikke sikker på om det er UCS2 eller UTF16 eller noget lignende. Så jeg gætter på, at det kunne have et problem med UTF8.