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 withhttp://
, 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 withload_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 commandattach
- a boolean (default: False); whether to attachfilename
, 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'