Deal mit Unicode-Benutzernamen in Python mkdtemp
Ich wurde von @ gebisshttp: //bugs.python.org/issue168197 - von dort zitierend:
mkdtemp schlägt unter Windows fehl, wenn der Windows-Benutzername Nicht-ASCII-Zeichen wie ä oder ö enthält. mkdtemp gibt einen Kodierungsfehler aus. Dies scheint daran zu liegen, dass das Standardtemp-Verzeichnis in Windows @ is"c:\documents and settings\<user name>\local settings\temp"
Die Umgehung, die das OP verwendet, ist:
try: # workaround for http://bugs.python.org/issue1681974
return tempfile.mkdtemp(prefix=prefix)
except UnicodeDecodeError:
tempdir = unicode(tempfile.gettempdir(), 'mbcs')
return tempfile.mkdtemp(prefix=prefix, dir=tempdir)
Ich habe 2 Fragen:
Warum sollte das funktionieren?Wie voller Beweis ist das? Aus einer ähnlichen Frage (siehe diese Antwort:Python Popen verwendet in Windows PowerShell @ nicht die richtige Codieru) Ich habe die Idee, dass ich vielleicht @ verwenden sollsys.stdout.encoding
- Bin ich irgendwo in der Nähe der Marke?Bearbeiten eigentlich die Zeile:
print u"input encoding: %s; output encoding: %s; locale: %s" % (
sys.stdin.encoding,getattr(sys.stdout,'encoding',None),
locale.getdefaultlocale())
prints
Input-Codierung: Keine; Ausgabecodierung: Keine; Gebietsschema: ('ja_JP', 'cp932')
so vielleicht sollte ich mich für locale.getpreferredencoding () entscheiden (siehe zum Beispiel subprocess.Popen mit einem Unicode-Pfad)
Edit2: in den Kommentaren wird empfohlen, das Präfix in mbcs zu kodieren - dies ist leider keine Option, da die Codebasis überall Unicode erwartet und früher oder später durchbrennt. Der bereitgestellte Code ist ein vereinfachtes Fragment.
Edit3: meine kleine Problemumgehung hat anscheinend nichts umgangen - werde versuchen:
fsenc = sys.getfilesystemencoding() or 'mbcs'
return tempfile.mkdtemp(prefix=prefix.encode(fsenc)).decode(fsenc)
wenn es noch einen nicht-ASCII-Benutzer zum Testen gibt.
In der Zwischenzeit funktionieren die unten aufgeführten Wiedergabegeräte bei mir nicht:
C:\_\Python27\python.exe -u C:\__\JetBrains\PyCharm 3.4.1\helpers\pydev\pydevconsole.py 18324 18325
PyDev console: starting.import sys; print('Python %s on %s' % (sys.version, sys.platform))
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
sys.path.extend(['C:\\Dropbox\\eclipse_workspaces\\python\\wrye-bash'])
>>> d = u'ελληνικα'.encode(sys.getfilesystemencoding()); os.environ['TEMP'] = os.path.abspath(d)
>>> import tempfile; tempfile.mkdtemp(prefix=u'x')
u'c:\\users\\mrd\\appdata\\local\\temp\\xtf3nav'
und Variationen ...
edit4 - das Verzeichnis existiert absolut:
>>> d = u'ελληνικα'.encode(sys.getfilesystemencoding()); os.path.abspath(d)
'C:\\Dropbox\\eclipse_workspaces\\python\\wrye-bash\\e??????a'
>>> assert os.path.isdir(os.path.abspath(d))
Traceback (most recent call last):
File "<input>", line 1, in <module>
AssertionError
>>> d = u'ελληνικα'
>>> os.path.abspath(d)
u'C:\\Dropbox\\eclipse_workspaces\\python\\wrye-bash\\\u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03b1'
>>> assert os.path.isdir(os.path.abspath(d))
>>>