Pergunta

Não consigo encontrar uma maneira correta de obter a variável de ambiente para o caminho appdata em python.

O problema é que meu nome de usuário inclui caracteres especiais (o alemão ae e ue).Fiz uma solução alternativa com PyQt para Vista e Windows 7, mas não funciona para sistemas XP.

Alguém sabe a codificação correta dessas variáveis ​​de ambiente ou outra solução para este problema?

Foi útil?

Solução

Como Mike diz, você pode obter a página de códigos do sistema em getfilesystemencoding.Essa codificação é usada para converter strings Unicode nativas do Windows em bytes para todas as funções C stdio usadas pelo Python, incluindo as chamadas do sistema de arquivos que usam caminhos de arquivos de strings de bytes e os.environ.

O que isto significa é que você será capaz de ler uma string com caracteres não-ASCII de os.environ e use-o diretamente como um caminho de arquivo sem nenhuma etapa especial de codificação/decodificação.

Infelizmente, se o %APPDATA% variável contém caracteres Unicode que não estão presentes na página de códigos do sistema — por exemplo, se em uma instalação do Windows em alemão (cp1252), seu caminho era C:\Documents and Settings\αβγ\Application Data— então esses personagens já terão sido mutilados antes que você tenha a chance de usá-los.Descodificar a cadeia de bytes que você obtém em Unicode usando a codificação do sistema de arquivos não ajudará nesse caso.

Aqui está uma função que você pode usar em versões recentes do Python que possuem o ctypes extensão, para ler variáveis ​​de ambiente Unicode nativas do 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

Em Python 3, o os.environ O dicionário contém strings Unicode obtidas diretamente do Windows sem codificação de página de código, portanto você não precisa se preocupar com esse problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top