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.
Loading an executable Sage script from the command prompt will run whatever code is inside an
if __name__ == “__main__”:section, as the condition on
__name__
will hold true (code run from the command prompt is considered to be running in the__main__
module.)EXAMPLES:
Note that
.py
files are not preparsed:sage: t = tmp_filename(ext='.py') sage: with open(t, 'w') as f: ....: _ = f.write("print(('hi', 2^3)); z = -2^7") sage: z = 1 sage: sage.repl.load.load(t, globals()) ('hi', 1) sage: z -7
A
.sage
file is preparsed:sage: t = tmp_filename(ext='.sage') sage: with open(t, 'w') as f: ....: _ = f.write("print(('hi', 2^3)); z = -2^7") sage: z = 1 sage: sage.repl.load.load(t, globals()) ('hi', 8) sage: z -128
Cython files are not preparsed:
sage: t = tmp_filename(ext='.pyx') sage: with open(t, 'w') as f: ....: _ = f.write("print(('hi', 2^3)); z = -2^7") sage: z = 1 sage: sage.repl.load.load(t, globals()) Compiling ... ('hi', 1) sage: z -7
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 (not tested for security reasons):
sage: sage.repl.load.load('http://www.sagemath.org/files/loadtest.py', globals()) # not tested hi from the net 5
We can load files using secure http (https):
sage: sage.repl.load.load('https://raw.githubusercontent.com/sagemath/sage-patchbot/2.8.4/sage_patchbot/util.py', globals()) # optional - internet
We attach a file:
sage: t = tmp_filename(ext='.py') sage: with open(t, 'w') as f: ....: _ = f.write("print('hello world')") sage: sage.repl.load.load(t, globals(), attach=True) hello world sage: t in attached_files() True
You cannot attach remote URLs (yet):
sage: sage.repl.load.load('http://www.sagemath.org/files/loadtest.py', globals(), attach=True) # optional - internet Traceback (most recent call last): ... NotImplementedError: you cannot 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: fname = 'test.py' sage: fullpath = os.path.join(t_dir, fname) sage: with open(fullpath, 'w') as f: ....: _ = f.write("print(37 * 3)") sage: load_attach_path(t_dir, replace=True) sage: attach(fname) 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: m = sage.repl.load.base64.b64decode("Zm9vLnNhZ2U=") sage: m == b'foo.sage' True