2010-04-09 15 views
7

Non riesco a trovare un modo corretto per ottenere la variabile di ambiente per il percorso di dati dell'applicazione in python.Problemi con dieresi in python appdata environvent variabile

Il problema è che il mio nome utente include caratteri speciali (il tedesco ae e ue). Ho fatto un trucco con PyQt per Vista e Windows 7 ma non funziona con XP Systems.

Qualcuno conosce la codifica corretta di queste variabili di ambiente o un'altra soluzione per questo problema?

risposta

8

Come dice Mike, è possibile ottenere la codepage del sistema da getfilesystemencoding. Questa codifica viene utilizzata per convertire le stringhe Unicode native di Windows in byte per tutte le funzioni C stdio utilizzate da Python, comprese le chiamate al file system che utilizzano percorsi di file stringa di byte e os.environ.

Ciò significa che sarà possibile leggere una stringa con caratteri non ASCII da os.environ e utilizzarla direttamente come percorso file senza alcun passaggio speciale di codifica/decodifica.

Purtroppo, se la variabile %APPDATA% contiene caratteri Unicode che non sono presenti nella tabella codici del sistema - per esempio, se in un tedesco (CP1252) installazione di Windows, il percorso è stato C:\Documents and Settings\αβγ\Application Data - allora quei personaggi avranno già stato storpiato prima avere la possibilità di usarli Decodificare la stringa di byte che si ottiene in Unicode utilizzando il file systemencoding non sarà di aiuto in questo caso.

Ecco una funzione che è possibile utilizzare sulle recenti versioni di Python che hanno l'estensione ctypes, per leggere le variabili di ambiente Unicode native di Windows.

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, il dizionario os.environ contiene stringhe Unicode prese direttamente da Windows, senza la codifica codepage, in modo da non dovete preoccuparvi di questo problema.

+0

Ciao, grazie bobince per la risposta. In questo modo ottengo il percorso Appdata corretto, ma non risolve il problema con le dieresi. Non riesco a trovare un modo per decodificare la stringa unicode da buf.value nel modo giusto. – Heike

+0

'buf.value' è già una stringa Unicode. Non è necessario decodificarlo. È possibile utilizzare le stringhe Unicode direttamente come nomi di file su Windows in Python 2.3 in poi (PEP277). – bobince

+0

ma os.path.exist (buf.value) restituisce false ... se provo con un nome senza dieresi funziona – Heike

Problemi correlati