2010-04-09 15 views
7

Ich kann keinen richtigen Weg finden, um die Umgebungsvariable für den appdata Pfad in Python zu bekommen.Probleme mit Umlauten in Python appdata environent Variable

Das Problem ist, dass mein Benutzername Sonderzeichen enthält (das deutsche ae und ue). Ich habe einen Workaround mit PyQt für Vista und Windows 7 gemacht, aber es funktioniert nicht für XP Systeme.

Kennt jemand die korrekte Codierung dieser Umgebungsvariablen oder eine andere Lösung für dieses Problem?

Antwort

8

Wie Mike sagt, können Sie die System-Codepage von getfilesystemencoding erhalten. Diese Codierung wird verwendet, um die nativen Unicode-Strings von Windows für alle von Python verwendeten C stdio-Funktionen in Byte umzuwandeln, einschließlich der Dateisystemaufrufe, die Byte-Zeichenketten-Dateipfade verwenden, und os.environ.

Dies bedeutet, dass Sie eine Zeichenfolge mit Nicht-ASCII-Zeichen von os.environ lesen und direkt als Dateipfad ohne einen speziellen Codierungs-/Decodierschritt verwenden können.

Leider, wenn die %APPDATA% Variable Unicode-Zeichen enthält, die nicht in der System-Codepage ist - zum Beispiel, wenn auf einem deutschen (cp1252) Windows installieren, Ihr Weg C:\Documents and Settings\αβγ\Application Data war - dann werden diese Zeichen schon, bevor Sie verstümmelt worden nutzen Sie die Chance, sie zu nutzen. Das Dekodieren der Bytezeichenfolge, die Sie mit Unicode mithilfe der Dateisystem-Codierung erhalten, wird in diesem Fall nicht helfen.

Hier ist eine Funktion, die Sie in aktuellen Python-Versionen mit der Erweiterung ctypes verwenden können, um native Unicode-Umgebungsvariablen von Windows zu lesen.

def getEnvironmentVariable(name): 
    name= unicode(name) # make sure string argument is unicode 
    n= ctypes.windll.kernel32.GetEnvironmentVariableW(name, None, 0) 
    if n==0: 
     return None 
    buf= ctypes.create_unicode_buffer(u'\0'*n) 
    ctypes.windll.kernel32.GetEnvironmentVariableW(name, buf, n) 
    return buf.value 

In Python 3, das os.environ Wörterbuch enthält Unicode-Strings direkt aus dem Windows ohne Codepage Codierung genommen, so dass Sie es sich nicht um dieses Problem zu kümmern.

+0

Hallo, Dank Bobince für Ihre Antwort. Auf diese Weise bekomme ich den richtigen Appdata-Pfad, aber das Problem mit den Umlauten wird nicht gelöst. Ich kann keinen Weg finden, die Unicode-Zeichenkette richtig von buf.value zu entschlüsseln. – Heike

+0

'buf.value' ist bereits eine Unicode-Zeichenfolge. Sie müssen es nicht entschlüsseln. Sie können Unicode-Zeichenfolgen direkt als Dateinamen unter Windows ab Python 2.3 (PEP277) verwenden. – bobince

+0

aber os.path.exist (buf.value) gibt false zurück ... Wenn ich es mit einem Namen ohne Umlaute versuche funktioniert es – Heike