Python で appdata パスの環境変数を取得する正しい方法が見つかりません。
問題は、ユーザー名に特殊文字 (ドイツ語の ae と ue) が含まれていることです。Vista と Windows 7 では PyQt を使用して回避策を作成しましたが、XP システムでは機能しません。
これらの環境変数の正しいエンコーディングまたはこの問題の別の解決策を知っている人はいますか?
Python で appdata パスの環境変数を取得する正しい方法が見つかりません。
問題は、ユーザー名に特殊文字 (ドイツ語の ae と ue) が含まれていることです。Vista と Windows 7 では PyQt を使用して回避策を作成しましたが、XP システムでは機能しません。
これらの環境変数の正しいエンコーディングまたはこの問題の別の解決策を知っている人はいますか?
Mike が言うように、システムのコードページは から取得できますgetfilesystemencoding
。このエンコーディングは、Windows のネイティブ Unicode 文字列を、バイト文字列ファイルパスを使用するファイルシステム呼び出しを含む、Python で使用されるすべての C stdio 関数のバイトに変換するために使用されますos.environ
。
これが意味することは、ASCII 以外の文字を含む文字列を読み取り、os.environ
特別なエンコード/デコード手順なしでファイルパスとして直接使用できるということです。
残念ながら、%APPDATA%
システムのコードページに存在しない Unicode 文字が変数に含まれている場合 (たとえば、ドイツ語 (cp1252) の Windows インストールでパスがC:\Documents and Settings\αβγ\Application Data
. . その場合、filesystemencoding を使用して取得したバイト文字列を Unicode にデコードしても役に立ちません。
ctypes
Windows ネイティブの Unicode 環境変数を読み取るために、拡張機能を持つ最近の Python バージョンで使用できる関数を次に示します。
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
Python 3 では、os.environ
コードページ エンコーディングなしで Windows から直接取得した Unicode 文字列が辞書に含まれているため、この問題について心配する必要はありません。