Problemas com tremas na variável de ambiente python appdata
-
25-09-2019 - |
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?
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.