[issue12632] Windows GPF with Code Page 65001

Bruce Ferris report at bugs.python.org
Mon Jul 25 19:58:20 CEST 2011


Bruce Ferris <bferris57 at bferris.co.uk> added the comment:

I disagree with the "it's not really a GPF since it calls Abort".

Consider the following cmd.exe session...

  Microsoft Windows [Version 6.0.6002]
  Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

  D:\>chcp 65001
  Active code page: 65001

  D:\>python >t.txt
  Fatal Python error: Py_Initialize: can't initialize sys standard streams
  LookupError: unknown encoding: cp65001

  This application has requested the Runtime to terminate it in an unusual way.
  Please contact the application's support team for more information.

  D:\>type t.txt

  D:\>dir t.txt
  Volume in drive D is DATA
  Volume Serial Number is 2E61-626C

  Directory of D:\

  25/07/2011  06:10 PM                 0 t.txt
                 1 File(s)              0 bytes
                 0 Dir(s)  16,768,655,360 bytes free

  D:\>

This means that, even if it was "intentional", from a programatic point of view. the Python process in this case leaves no other indication other than transient bytes in the transient cmd.exe console buffer.  No way of redirecting the output and examining it.

I strongly disagree with the statement "(If it were a true segfault-like error, there would be no message from Python itself.)"

The "no message from Python itself" case is shown above.

My application handles code page 65001 just fine, no problems.  If it attempts to use Windows WriteConsole function and it fails, it tries using WriteFile instead.  So, when my application fails and output is redirected, it produces output.

But, Python 3.1 doesn't.  See the following Microsoft MSDN link, it states the WriteConsole point explicitly...

  http://msdn.microsoft.com/en-us/library/ms687401%28v=VS.85%29.aspx

So, if Python doesn't like Code Page 65001, for whatever reason, it can simply save it on startup, and change it to whatever makes it happy.  Then, upon Python exit (including Abort), change it back to 65001 before calling Abort.

I'm sorry, but the following is "easy" in my book...

  1) At Startup...  Call GetConsoleOutputCP and save that somewhere.

                    If code page is 65001, change it to something that
                    doesn't cause problems by calling SetConsoleOutputCP

  2) On Write... If WriteConsole fails, try calling WriteFile instead.

  3) At Abort or Exit... Call SetConsoleOutputCP to set it back
                         to whatever it was on Startup.

I don't care if your app (Python) can display UTF-8 on Microsoft's cmd.exe console or if it can't. 

All I'm trying to do is point out a bit of misbehaviour that CAN be easily changed and will make your product more resilient.

I don't know the details of how Python deals with character encoding and, quite honestly, I shouldn't need to since it's not my product.  however, I DO know how I handle a similiar scenario in my own app.

Microsoft made it complicated, not me.  But, I can "easily" get around the problem using the above scenario.  If Python can't do it just as "easily", then it tells me more about Python's implementation and the people behind Python then it tells me about Microsoft and the people behind Windows.

Don't get me wrong, I love Python as a tool for solving certain classes of problems and, please, keep up the good work.  It's appreciated.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue12632>
_______________________________________


More information about the Python-bugs-list mailing list