Hi all.

Is there any way to disable the default asynchronous exception raising SIGINT signal handling? Or a plan to add support for this? My searches on the net found several bug reports and discussions regarding this, but nothing seems final... :-(

I believe the current Python default SIGINT handling by raising an asynchronous KeyboardInterrupt exception is dangerous, and can directly cause Python interpreter crashes even if no user code is involved, or any sort of other 'undefined behaviour' if it is.

On Windows at least (using Python 3.3.3 at the moment, but seen with earlier versions as well), I occasionally get 'python.exe has stopped working' dialogs when Ctrl-C is pressed (most often if pressed during Python's initialization - loading site.py or earlier).

The problem with asynchronous exceptions is, of course, that they can occur at _any_ time, even at the start of a finally: block, effectively causing cleanup code to be skipped even though the programmer intended it to be called even in case of exceptions.

My scripts replace the default SIGINT/SIGBREAK signal handlers as soon as possible, and everything works great after that, but things get ugly if Ctrl-C is pressed before the script gets a chance to do this. I could even live with an 'exit with an ugly traceback', but having the process hang or fail so that Windows reports it as non-responding or reports it as 'stopped working' and offers to send failure information to Microsoft? That just leaves a bad taste in my mouth. :-(

Also, Python documentation should not helpfully state or infer in several places that user can handle KeyboardInterrupt exceptions to implement Ctrl-C handling. Even if you do manage to catch it, you must never ever ignore it and must terminate your application since it might have already been left in an inconsistent state internally (e.g. some important finally clause got skipped, even one located deep in the Python standard library internals). Doing anything else can only be considered a partially working hack. Another problem is that that multiple SIGINT signals might occur in a sequence and any such KeyboardInterrupt handling can itself be interrupted in the same way as the original code. You can say that this is 'unlikely', or even add additional code to make this even more unlikely, but it still smells bad. :-(

  Hope this helps.

  Best regards,
    Jurko Gospodnetić


Below, I've included a few script outputs (tracebacks included) from instances where Python interpreter crashed due to pressing Ctrl-C soon after an empty Python script has been run.

In the first of these instances I got the Microsoft's error reporting dialog. In all the later instances I checked the Python process's debug output and every time it included the message: 'Microsoft Visual Studio C Runtime Library has detected a fatal error in python.exe.'.

Using:
  - OS: Windows 7 SP1 x64
  - Python 3.3.3 (64-it)
  - default site.py

--------------
Occurrence #1:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 755, in _open_registry
FileNotFoundError: [WinError 2] The system cannot find the file specified

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\encodings\__init__.py", line 98, 
in search_function
    level=0)
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1523, in_find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1477, in _find_module
  File "<frozen importlib._bootstrap>", line 777, in find_module
  File "<frozen importlib._bootstrap>", line 768, in _search_registry
  File "<frozen importlib._bootstrap>", line 755, in _open_registry
KeyboardInterrupt


--------------
Occurrence #2:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\codecs.py", line 165, in __init__
    def __init__(self, errors='strict'):
KeyboardInterrupt


--------------
Occurrence #3:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1523, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1477, in _find_module
  File "<frozen importlib._bootstrap>", line 1309, in find_module
  File "<frozen importlib._bootstrap>", line 1288, in _get_loader
  File "<frozen importlib._bootstrap>", line 1387, in find_loader
  File "<frozen importlib._bootstrap>", line 110, in _path_isfile
  File "<frozen importlib._bootstrap>", line 101, in _path_is_mode_type
KeyboardInterrupt


--------------
Occurrence #4:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\io.py", line 52, in <module>
    import abc
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1533, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 486, in _verbose_message
KeyboardInterrupt


--------------
Occurrence #5:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\io.py", line 52, in <module>
    import abc
  File "C:\Program Files\Python\Python333\lib\abc.py", line 6, in <module>
    from _weakrefset import WeakSet
  File "<frozen importlib._bootstrap>", line 1559, in _find_and_load
KeyboardInterrupt


--------------
Occurrence #6:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\encodings\__init__.py", line 69, 
in search_function
    def search_function(encoding):
KeyboardInterrupt


--------------
Occurrence #7:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\io.py", line 52, in <module>
    import abc
  File "C:\Program Files\Python\Python333\lib\abc.py", line 6, in <module>
    from _weakrefset import WeakSet
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 584, in _check_name_wrapper
  File "<frozen importlib._bootstrap>", line 1022, in load_module
  File "<frozen importlib._bootstrap>", line 1003, in load_module
KeyboardInterrupt


--------------
Occurrence #8:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\encodings\__init__.py", line 98, 
in search_function
    level=0)
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 584, in _check_name_wrapper
  File "<frozen importlib._bootstrap>", line 1022, in load_module
  File "<frozen importlib._bootstrap>", line 1003, in load_module
  File "<frozen importlib._bootstrap>", line 560, in module_for_loader_wrapper
  File "<frozen importlib._bootstrap>", line 857, in _load_module
  File "<frozen importlib._bootstrap>", line 439, in cache_from_source
KeyboardInterrupt


--------------
Occurrence #9:
--------------
D:\Workplace>run.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Program Files\Python\Python333\lib\encodings\__init__.py", line 98, 
in search_function
    level=0)
  File "C:\Program Files\Python\Python333\lib\encodings\cp852.py", line 175, in 
<module>
    0x00ff: 0x00a0,     #  NO-BREAK SPACE
KeyboardInterrupt

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to