0
votes

I recently installed Sage 6.3 on my Fedora 21 machine. I'm using version 6.3, which is slightly outdated, because it is the most recent thing available in yum's repositories. I also installed Mathematica on the same computer in the hope of being able to call it from within Sage.

Mathematica's terminal interface using the math command works, which according to this reference page should be all that I need. However, when I tell Sage to use mathematica either from the Sage command line or the notebook, Sage hangs. Here's a sample of my interaction with the terminal (the traceback is horrible, as is frequently the case in Sage):

sage: mathematica('hello world')
^CInterrupting Mathematica...
^C---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-1-9208bb19d841> in <module>()
----> 1 mathematica('hello world')

/usr/lib64/python2.7/site-packages/sage/interfaces/interface.pyc in __call__(self, x, name)
    197
    198         if isinstance(x, basestring):
--> 199             return cls(self, x, name=name)
    200         try:
    201             return self._coerce_from_special_method(x)

/usr/lib64/python2.7/site-packages/sage/interfaces/expect.pyc in __init__(self, parent, value, is_name, name)
   1310         else:
   1311             try:
-> 1312                 self._name = parent._create(value, name=name)
   1313             # Convert ValueError and RuntimeError to TypeError for
   1314             # coercion to work properly.

/usr/lib64/python2.7/site-packages/sage/interfaces/interface.pyc in _create(self, value, name)
    387     def _create(self, value, name=None):
    388         name = self._next_var_name() if name is None else name
--> 389         self.set(name, value)
    390         return name
    391

/usr/lib64/python2.7/site-packages/sage/interfaces/mathematica.pyc in set(self, var, value)
    508         cmd = '%s=%s;'%(var,value)
    509         #out = self.eval(cmd)
--> 510         out = self._eval_line(cmd, allow_use_file=True)
    511         if len(out) > 8:
    512             raise TypeError("Error executing code in Mathematica\nCODE:\n\t%s\nMathematica ERROR:\n\t%s"%(cmd, out))

/usr/lib64/python2.7/site-packages/sage/interfaces/mathematica.pyc in _eval_line(self, line, allow_use_file, wait_for_prompt, restart_if_needed)
    535     def _eval_line(self, line,  allow_use_file=True, wait_for_prompt=True, restart_if_needed=False):
    536         s = Expect._eval_line(self, line,
--> 537              allow_use_file=allow_use_file, wait_for_prompt=wait_for_prompt)
    538         return str(s).strip('\n')
    539

/usr/lib64/python2.7/site-packages/sage/interfaces/expect.pyc in _eval_line(self, line, allow_use_file, wait_for_prompt, restart_if_needed)
    890                     out = ''
    891         except KeyboardInterrupt:
--> 892             self._keyboard_interrupt()
    893             raise KeyboardInterrupt("Ctrl-c pressed while running %s"%self)
    894         if self._terminal_echo:

/usr/lib64/python2.7/site-packages/sage/interfaces/mathematica.pyc in _keyboard_interrupt(self)
    420         e = self._expect
    421         e.sendline(chr(3))  # send ctrl-c
--> 422         e.expect('Interrupt> ')
    423         e.sendline("a")  # a -- abort
    424         e.expect(self._prompt)

/usr/lib64/sagemath/site-packages/pexpect.pyc in expect(self, pattern, timeout, searchwindowsize)
    914         """
    915         compiled_pattern_list = self.compile_pattern_list(pattern)
--> 916         return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
    917
    918     def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):

/usr/lib64/sagemath/site-packages/pexpect.pyc in expect_list(self, pattern_list, timeout, searchwindowsize)
    965                     raise TIMEOUT ('Timeout exceeded in expect_list().')
    966                 # Still have time left, so read more data
--> 967                 c = self.read_nonblocking (self.maxread, timeout)
    968                 incoming = incoming + c
    969                 if timeout is not None:

/usr/lib64/sagemath/site-packages/pexpect.pyc in read_nonblocking(self, size, timeout)
    546                 raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
    547
--> 548         r, w, e = select.select([self.child_fd], [], [], timeout)
    549         if not r:
    550             if not self.isalive():

/usr/lib64/python2.7/site-packages/sage/ext/c_lib.so in sage.ext.c_lib.sage_python_check_interrupt (build/cythonized/sage/ext/c_lib.c:1683)()

/usr/lib64/python2.7/site-packages/sage/ext/c_lib.so in sage.ext.c_lib.sig_raise_exception (build/cythonized/sage/ext/c_lib.c:769)()

KeyboardInterrupt:
sage:

The equivalent in Mathematica's own interface works just fine:

Mathematica 10.1.0 for Linux x86 (64-bit)
Copyright 1988-2015 Wolfram Research, Inc.

In[1]:= hello world

Out[1]= hello world

In[2]:=

Am I doing something wrong, or is this a bug in Sage? Would downloading and building the latest version (6.7) manually fix the problem?

EDIT:

I am using Mathematica 10.1.0. Could it be that be my problem, i.e. the older version of Sage doesn't know how to handle the newer version of Mathematica?

1
I asked this question here because I know there's a small-but-active community of Sage experts. In some ways, it would be a better fit elsewhere - if the community thinks it should be moved, I will gladly cooperate with a migration to SuperUser or elsewhere.Matthew
True, probably better on SuperUser, though even less likely to be seen - ask.sagemath.org is probably best.kcrisman

1 Answers

3
votes

According to Trac 16703, this problem should be fixed in the latest Sage. I don't personally have a copy of Mathematica to test this on.