Bug 1258006 - After the latest update to sagemath, sagemath now crashes when trying to run the application from a terminal.
Summary: After the latest update to sagemath, sagemath now crashes when trying to run ...
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Fedora
Classification: Fedora
Component: sagemath
Version: 22
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Paulo Andrade
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
: 1258249 (view as bug list)
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2015-08-28 15:20 UTC by Patrick Meehan
Modified: 2015-09-27 03:23 UTC (History)
3 users (show)

Fixed In Version: sagemath-6.5-9.fc22
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2015-09-27 03:23:17 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)

Description Patrick Meehan 2015-08-28 15:20:29 UTC
Description of problem: 
When trying to execute the command 'sage', the application crashes. First line of the error message is:-

'Oops, Sage crashed. We do our best to make it stable, but...'


Version-Release number of selected component (if applicable): 
6.5

How reproducible:
Just enter 'sage' at a command prompt.

Steps to Reproduce:
1. Start a terminal.
2. Enter 'sage'
3. Error message then appears after the application has crashed.

Actual results:
*****Error message from terminal*****
┌────────────────────────────────────────────────────────────────────┐
│ Sage Version 6.5, Release Date: 2015-02-17                         │
│ Type "notebook()" for the browser-based notebook interface.        │
│ Type "help()" for help.                                            │
└────────────────────────────────────────────────────────────────────┘

**********************************************************************

Oops, Sage crashed. We do our best to make it stable, but...

A crash report was automatically generated with the following information:
  - A verbatim copy of the crash traceback.
  - A copy of your input history during this session.
  - Data on your current Sage configuration.

It was left in the file named:
	'/home/merlin/.ipython/Sage_crash_report.txt'
If you can email this file to the developers, the information in it will help
them in understanding and correcting the problem.

You can mail it to: sage-support at sage-support
with the subject 'Sage Crash Report'.

If you want to do it now, the following command will work (under Unix):
mail -s 'Sage Crash Report' sage-support < /home/merlin/.ipython/Sage_crash_report.txt

To ensure accurate tracking of this issue, please file a report about it at:
http://trac.sagemath.org

Hit <Enter> to quit (your terminal may close):

*****Error message from sage crash report file*****
***************************************************************************

IPython post-mortem report

{'commit_hash': 'af17558',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/lib/python2.7/site-packages/IPython',
 'ipython_version': '2.4.1',
 'os_name': 'posix',
 'platform': 'Linux-4.1.6-200.fc22.x86_64-x86_64-with-fedora-22-Twenty_Two',
 'sys_executable': '/usr/bin/python',
 'sys_platform': 'linux2',
 'sys_version': '2.7.10 (default, Jul  5 2015, 14:15:43) \n[GCC 5.1.1 20150618 (Red Hat 5.1.1-4)]'}

***************************************************************************



***************************************************************************

Crash traceback:

---------------------------------------------------------------------------
ImportError                                  Python 2.7.10: /usr/bin/python
                                                   Fri Aug 28 15:49:21 2015
A problem occured executing Python code.  Here is the sequence of function
calls leading up to the error, with the most recent (innermost) call last.
/usr/lib64/sagemath/local/bin/sage-ipython in <module>()
      1 #!/usr/bin/env python
      2 # -*- coding: utf-8 -*-
      3 """
      4 Sage IPython startup script.
      5 """
      6 from sage.repl.interpreter import SageTerminalApp
      7 
      8 # installs the extra readline commands before the IPython initialization begins.
      9 from sage.repl.readline_extra_commands import *
     10 
     11 app = SageTerminalApp.instance()
---> 12 app.initialize()
        global app.initialize = <bound method SageTerminalApp.initialize of <sage.repl.interpreter.SageTerminalApp object at 0x7f6a17d09b90>>
     13 app.start()

/usr/lib/python2.7/site-packages/IPython/terminal/ipapp.pyc in initialize(self=<sage.repl.interpreter.SageTerminalApp object>, argv=None)

/usr/lib/python2.7/site-packages/IPython/config/application.pyc in catch_config_error(method=<function initialize>, app=<sage.repl.interpreter.SageTerminalApp object>, *args=(None,), **kwargs={})
     77 
     78 #-----------------------------------------------------------------------------
     79 # Application class
     80 #-----------------------------------------------------------------------------
     81 
     82 @decorator
     83 def catch_config_error(method, app, *args, **kwargs):
     84     """Method decorator for catching invalid config (Trait/ArgumentErrors) during init.
     85 
     86     On a TraitError (generally caused by bad config), this will print the trait's
     87     message, and exit the app.
     88     
     89     For use on init methods, to prevent invoking excepthook on invalid input.
     90     """
     91     try:
---> 92         return method(app, *args, **kwargs)
        method = <function initialize at 0x7f6a17cff1b8>
        app = <sage.repl.interpreter.SageTerminalApp object at 0x7f6a17d09b90>
        args = (None,)
        kwargs = {}
     93     except (TraitError, ArgumentError) as e:
     94         app.print_help()
     95         app.log.fatal("Bad config encountered during initialization:")
     96         app.log.fatal(str(e))
     97         app.log.debug("Config at the time: %s", app.config)
     98         app.exit(1)
     99 
    100 
    101 class ApplicationError(Exception):
    102     pass
    103 
    104 class LevelFormatter(logging.Formatter):
    105     """Formatter with additional `highlevel` record
    106     
    107     This field is empty if log level is less than highlevel_limit,

/usr/lib/python2.7/site-packages/IPython/terminal/ipapp.pyc in initialize(self=<sage.repl.interpreter.SageTerminalApp object>, argv=None)
    317     
    318     @catch_config_error
    319     def initialize(self, argv=None):
    320         """Do actions after construct, but before starting the app."""
    321         super(TerminalIPythonApp, self).initialize(argv)
    322         if self.subapp is not None:
    323             # don't bother initializing further, starting subapp
    324             return
    325         if not self.ignore_old_config:
    326             check_for_old_config(self.ipython_dir)
    327         # print self.extra_args
    328         if self.extra_args and not self.something_to_run:
    329             self.file_to_run = self.extra_args[0]
    330         self.init_path()
    331         # create the shell
--> 332         self.init_shell()
        self.init_shell = <bound method SageTerminalApp.init_shell of <sage.repl.interpreter.SageTerminalApp object at 0x7f6a17d09b90>>
    333         # and draw the banner
    334         self.init_banner()
    335         # Now a variety of things that happen after the banner is printed.
    336         self.init_gui_pylab()
    337         self.init_extensions()
    338         self.init_code()
    339 
    340     def init_shell(self):
    341         """initialize the InteractiveShell instance"""
    342         # Create an InteractiveShell instance.
    343         # shell.display_banner should always be False for the terminal
    344         # based app, because we call shell.show_banner() by hand below
    345         # so the banner shows *before* all extension loading stuff.
    346         self.shell = TerminalInteractiveShell.instance(parent=self,
    347                         display_banner=False, profile_dir=self.profile_dir,

/usr/lib64/python2.7/site-packages/sage/repl/interpreter.pyc in init_shell(self=<sage.repl.interpreter.SageTerminalApp object>)
    599         # Shell initialization
    600         self.shell = SageTerminalInteractiveShell.instance(
    601             parent=self,
    602             config=self.config,
    603             display_banner=False,
    604             profile_dir=self.profile_dir,
    605             ipython_dir=self.ipython_dir)
    606         self.shell.configurables.append(self)
    607         self.shell.has_sage_extensions = SAGE_EXTENSION in self.extensions
    608 
    609         if self.shell.has_sage_extensions:
    610             self.extensions.remove(SAGE_EXTENSION)
    611 
    612             # load sage extension here to get a crash if
    613             # something is wrong with the sage library
--> 614             self.shell.extension_manager.load_extension(SAGE_EXTENSION)
        self.shell.extension_manager.load_extension = <bound method ExtensionManager.load_extension of <IPython.core.extensions.ExtensionManager object at 0x7f6a14d5f110>>
        global SAGE_EXTENSION = 'sage'
    615 
    616 

/usr/lib/python2.7/site-packages/IPython/core/extensions.pyc in load_extension(self=<IPython.core.extensions.ExtensionManager object>, module_str='sage')
     85 
     86         Returns the string "already loaded" if the extension is already loaded,
     87         "no load function" if the module doesn't have a load_ipython_extension
     88         function, or None if it succeeded.
     89         """
     90         if module_str in self.loaded:
     91             return "already loaded"
     92         
     93         from IPython.utils.syspathcontext import prepended_to_syspath
     94         
     95         with self.shell.builtin_trap:
     96             if module_str not in sys.modules:
     97                 with prepended_to_syspath(self.ipython_extension_dir):
     98                     __import__(module_str)
     99             mod = sys.modules[module_str]
--> 100             if self._call_load_ipython_extension(mod):
        self._call_load_ipython_extension = <bound method ExtensionManager._call_load_ipython_extension of <IPython.core.extensions.ExtensionManager object at 0x7f6a14d5f110>>
        mod = <module 'sage' from '/usr/lib64/python2.7/site-packages/sage/__init__.pyc'>
    101                 self.loaded.add(module_str)
    102             else:
    103                 return "no load function"
    104 
    105     def unload_extension(self, module_str):
    106         """Unload an IPython extension by its module name.
    107 
    108         This function looks up the extension's name in ``sys.modules`` and
    109         simply calls ``mod.unload_ipython_extension(self)``.
    110         
    111         Returns the string "no unload function" if the extension doesn't define
    112         a function to unload itself, "not loaded" if the extension isn't loaded,
    113         otherwise None.
    114         """
    115         if module_str not in self.loaded:

/usr/lib/python2.7/site-packages/IPython/core/extensions.pyc in _call_load_ipython_extension(self=<IPython.core.extensions.ExtensionManager object>, mod=<module 'sage' from '/usr/lib64/python2.7/site-packages/sage/__init__.pyc'>)
    132         """
    133         from IPython.utils.syspathcontext import prepended_to_syspath
    134 
    135         if (module_str in self.loaded) and (module_str in sys.modules):
    136             self.unload_extension(module_str)
    137             mod = sys.modules[module_str]
    138             with prepended_to_syspath(self.ipython_extension_dir):
    139                 reload(mod)
    140             if self._call_load_ipython_extension(mod):
    141                 self.loaded.add(module_str)
    142         else:
    143             self.load_extension(module_str)
    144 
    145     def _call_load_ipython_extension(self, mod):
    146         if hasattr(mod, 'load_ipython_extension'):
--> 147             mod.load_ipython_extension(self.shell)
        mod.load_ipython_extension = <function load_ipython_extension at 0x7f6a17d03d70>
        self.shell = <sage.repl.interpreter.SageTerminalInteractiveShell object at 0x7f6a1787ced0>
    148             return True
    149 
    150     def _call_unload_ipython_extension(self, mod):
    151         if hasattr(mod, 'unload_ipython_extension'):
    152             mod.unload_ipython_extension(self.shell)
    153             return True
    154 
    155     def install_extension(self, url, filename=None):
    156         """Download and install an IPython extension. 
    157 
    158         If filename is given, the file will be so named (inside the extension
    159         directory). Otherwise, the name from the URL will be used. The file must
    160         have a .py or .zip extension; otherwise, a ValueError will be raised.
    161 
    162         Returns the full path to the installed file.

/usr/lib64/python2.7/site-packages/sage/repl/ipython_extension.pyc in wrapper(*args=(<sage.repl.interpreter.SageTerminalInteractiveShell object>,), **kwargs={})
    416         ....:     if work:
    417         ....:         return 'foo worked'
    418         ....:     raise RuntimeError("foo didn't work")
    419         sage: foo(False)
    420         Traceback (most recent call last):
    421         ...
    422         RuntimeError: foo didn't work
    423         sage: foo(True)
    424         'foo worked'
    425         sage: foo(False)
    426         sage: foo(True)
    427     """
    428     @wraps(func)
    429     def wrapper(*args, **kwargs):
    430         if not wrapper.has_run:
--> 431             result = func(*args, **kwargs)
        result = undefined
        global func = undefined
        args = (<sage.repl.interpreter.SageTerminalInteractiveShell object at 0x7f6a1787ced0>,)
        kwargs = {}
    432             wrapper.has_run = True
    433             return result
    434     wrapper.has_run = False
    435     return wrapper
    436 
    437 
    438 @run_once
    439 def load_ipython_extension(ip):
    440     """
    441     Load the extension in IPython.
    442     """
    443     # this modifies ip
    444     SageCustomizations(shell=ip)

/usr/lib64/python2.7/site-packages/sage/repl/ipython_extension.pyc in load_ipython_extension(ip=<sage.repl.interpreter.SageTerminalInteractiveShell object>)
    429     def wrapper(*args, **kwargs):
    430         if not wrapper.has_run:
    431             result = func(*args, **kwargs)
    432             wrapper.has_run = True
    433             return result
    434     wrapper.has_run = False
    435     return wrapper
    436 
    437 
    438 @run_once
    439 def load_ipython_extension(ip):
    440     """
    441     Load the extension in IPython.
    442     """
    443     # this modifies ip
--> 444     SageCustomizations(shell=ip)
        global SageCustomizations = <class 'sage.repl.ipython_extension.SageCustomizations'>
        global shell = undefined
        ip = <sage.repl.interpreter.SageTerminalInteractiveShell object at 0x7f6a1787ced0>

/usr/lib64/python2.7/site-packages/sage/repl/ipython_extension.pyc in __init__(self=<sage.repl.ipython_extension.SageCustomizations object>, shell=<sage.repl.interpreter.SageTerminalInteractiveShell object>)
    286 
    287         self.shell.display_formatter.formatters['text/plain'].set_display(
    288                 self._magic_display_status)
    289 
    290 class SageCustomizations(object):
    291 
    292     def __init__(self, shell=None):
    293         """
    294         Initialize the Sage plugin.
    295         """
    296         self.shell = shell
    297 
    298         self.auto_magics = SageMagics(shell)
    299         self.shell.register_magics(self.auto_magics)
    300 
--> 301         import sage.repl.display.formatter as formatter
        sage.repl.display.formatter = undefined
        formatter = undefined
    302         self.shell.display_formatter.formatters['text/plain'] = (
    303                 formatter.SageConsoleTextFormatter(config=shell.config))
    304 
    305         import sage.misc.edit_module as edit_module
    306         self.shell.set_hook('editor', edit_module.edit_devel)
    307 
    308         self.init_inspector()
    309         self.init_line_transforms()
    310 
    311         import inputhook
    312         inputhook.install()
    313 
    314         import sage.all # until sage's import hell is fixed
    315 
    316         self.shell.verbose_quit = True

/usr/lib64/python2.7/site-packages/sage/repl/display/formatter.py in <module>()
     49 This other facility uses a simple
     50 :class:`~sage.misc.ascii_art.AsciiArt` object (see and
     51 :meth:`sage.structure.sage_object.SageObject._ascii_art_`).  """
     52 
     53 #*****************************************************************************
     54 #       Copyright (C) 2014 Volker Braun <vbraun.name>
     55 #
     56 #  Distributed under the terms of the GNU General Public License (GPL)
     57 #  as published by the Free Software Foundation; either version 2 of
     58 #  the License, or (at your option) any later version.
     59 #                  http://www.gnu.org/licenses/
     60 #*****************************************************************************
     61 
     62 
     63 from IPython.core.formatters import PlainTextFormatter
---> 64 from IPython.core.formatters import catch_format_error as warn_format_error
        global IPython.core.formatters = undefined
        global catch_format_error = undefined
        global warn_format_error = undefined
     65 from IPython.utils.py3compat import str_to_unicode, unicode_to_str
     66 
     67 from sage.repl.display.pretty_print import (
     68     SagePrettyPrinter, AsciiArtPrettyPrinter, TypesetPrettyPrinter
     69 )
     70 
     71 
     72 class SagePlainTextFormatter(PlainTextFormatter):
     73 
     74     def __init__(self, *args, **kwds):
     75         r"""
     76         Improved plain text formatter.
     77 
     78         In particular, it has the following two features:
     79     

ImportError: cannot import name catch_format_error

***************************************************************************

History of session input:
*** Last line of input (may not be in above history):



Expected results:
Should be presented with the usual 'sage' command prompt.


Additional info:
This problem has occurred due to the last sagemath update. This has happened on both of my PCs.

Comment 1 Paulo Andrade 2015-08-29 03:48:37 UTC
Thanks for noticing the problem.
I will make an update. If you have a fedora account, please
give it karma once it hits testing.

For the moment, you can correct it by reverting this patch:
http://pkgs.fedoraproject.org/cgit/sagemath.git/tree/sagemath-ipython3.patch

You can edit the file:

/usr/lib64/python2.7/site-packages/sage/repl/display/formatter.py

Replace lines 63 and 64 with:

from IPython.core.formatters import PlainTextFormatter, warn_format_error

It was my fault to forget to apply conditionally the patch
when making a f22 update.

Comment 2 Fedora Update System 2015-08-29 17:15:25 UTC
sagemath-6.5-9.fc22 has been submitted as an update to Fedora 22. https://bodhi.fedoraproject.org/updates/FEDORA-2015-14561

Comment 3 Fedora Update System 2015-09-01 09:58:49 UTC
sagemath-6.5-9.fc22 has been pushed to the Fedora 22 testing repository. If problems still persist, please make note of it in this bug report.\nIf you want to test the update, you can install it with \n su -c 'yum --enablerepo=updates-testing update sagemath'. You can provide feedback for this update here: https://bodhi.fedoraproject.org/updates/FEDORA-2015-14561

Comment 4 Germano Massullo 2015-09-06 14:56:43 UTC
*** Bug 1258249 has been marked as a duplicate of this bug. ***

Comment 5 Fedora Update System 2015-09-27 03:23:13 UTC
sagemath-6.5-9.fc22 has been pushed to the Fedora 22 stable repository. If problems still persist, please make note of it in this bug report.


Note You need to log in before you can comment on or make changes to this bug.