Load Python, Sage, Cython, Fortran and Magma files in Sage

sage.repl.load.is_loadable_filename(filename)

Returns whether a file can be loaded into Sage. This checks only whether its name ends in one of the supported extensions .py, .pyx, .sage, .spyx, .f, .f90 and .m. Note: load() assumes the latter signifies a Magma file.

INPUT:

  • filename - a string

OUTPUT:

  • a boolean

EXAMPLES:

sage: sage.repl.load.is_loadable_filename('foo.bar')
False
sage: sage.repl.load.is_loadable_filename('foo.c')
False
sage: sage.repl.load.is_loadable_filename('foo.sage')
True
sage: sage.repl.load.is_loadable_filename('FOO.F90')
True
sage: sage.repl.load.is_loadable_filename('foo.m')
True
sage.repl.load.load(filename, globals, attach=False)

Executes a file in the scope given by globals. If the name starts with http://, it is treated as a URL and downloaded.

Note

For Cython files, the situation is more complicated – the module is first compiled to a temporary module t and executed via:

from t import *

INPUT:

  • filename – a string denoting a filename or URL.
  • globals – a string:object dictionary; the context in which to execute the file contents.
  • attach – a boolean (default: False); whether to add the file to the list of attached files.

EXAMPLES:

Note that .py files are not preparsed:

sage: t = tmp_filename(ext='.py')
sage: _ = open(t,'w').write("print 'hi', 2/3; z = -2/7")
sage: z = 1
sage: sage.repl.load.load(t, globals())  # optional - python2
hi 0
sage: z  # optional - python2
-1

A .sage file is preparsed:

sage: t = tmp_filename(ext='.sage')
sage: _ = open(t,'w').write("print 'hi', 2/3; z = -2/7")
sage: z = 1
sage: sage.repl.load.load(t, globals())
hi 2/3
sage: z
-2/7

Cython files are not preparsed:

sage: t = tmp_filename(ext='.pyx')
sage: _ = open(t,'w').write("print 'hi', 2/3; z = -2/7")
sage: z = 1
sage: sage.repl.load.load(t, globals())
Compiling ...
hi 0
sage: z
-1

If the file isn’t a Cython, Python, or a Sage file, a ValueError is raised:

sage: sage.repl.load.load(tmp_filename(ext=".foo"), globals())
Traceback (most recent call last):
...
ValueError: unknown file extension '.foo' for load or attach (supported extensions: .py, .pyx, .sage, .spyx, .f, .f90, .m)

We load a file given at a remote URL:

sage: sage.repl.load.load('http://wstein.org/loadtest.py', globals())  # optional - internet
hi from the net
5

We can load files using secure http (https):

sage: sage.repl.load.load('https://github.com/jasongrout/minimum_rank/raw/minimum_rank_1_0_0/minrank.py', globals())  # optional - internet

We attach a file:

sage: t = tmp_filename(ext='.py')
sage: _ = open(t,'w').write("print 'hello world'")
sage: sage.repl.load.load(t, globals(), attach=True)
hello world
sage: t in attached_files()
True

You can’t attach remote URLs (yet):

sage: sage.repl.load.load('http://wstein.org/loadtest.py', globals(), attach=True)  # optional - internet
Traceback (most recent call last):
...
NotImplementedError: you can't attach a URL

The default search path for loading and attaching files is the current working directory, i.e., '.'. But you can modify the path with load_attach_path():

sage: sage.repl.attach.reset(); reset_load_attach_path()
sage: load_attach_path()
['.']
sage: t_dir = tmp_dir()
sage: fullpath = os.path.join(t_dir, 'test.py')
sage: _ = open(fullpath, 'w').write("print 37 * 3")
sage: load_attach_path(t_dir)
sage: attach('test.py')
111
sage: sage.repl.attach.reset(); reset_load_attach_path() # clean up

or by setting the environment variable SAGE_LOAD_ATTACH_PATH to a colon-separated list before starting Sage:

$ export SAGE_LOAD_ATTACH_PATH="/path/to/my/library:/path/to/utils"
$ sage
sage: load_attach_path()          # not tested
['.', '/path/to/my/library', '/path/to/utils']
sage.repl.load.load_cython(name)

Helper function to load a Cython file.

INPUT:

  • name – filename of the Cython file

OUTPUT:

  • A string with Python code to import the names from the compiled module.
sage.repl.load.load_wrap(filename, attach=False)

Encodes a load or attach command as valid Python code.

INPUT:

  • filename - a string; the argument to the load or attach command
  • attach - a boolean (default: False); whether to attach filename, instead of loading it

OUTPUT:

  • a string

EXAMPLES:

sage: sage.repl.load.load_wrap('foo.py', True)
'sage.repl.load.load(sage.repl.load.base64.b64decode("Zm9vLnB5"),globals(),True)'
sage: sage.repl.load.load_wrap('foo.sage')
'sage.repl.load.load(sage.repl.load.base64.b64decode("Zm9vLnNhZ2U="),globals(),False)'
sage: sage.repl.load.base64.b64decode("Zm9vLnNhZ2U=")
'foo.sage'