Update Jan 2020: E.M. Bray suggests a more elegant solution in the comments, see: https://ask.sagemath.org/question/7867/importing-sage-files/?answer=48947#post-id-48947.
—
Let’s say that I have created a bunch of Sage code — Sage functions etc. — that I wish to reuse by importing into various Sage scripts. In straight Python, one would put these functions into their own separate file and import them using the usual from foo import funcname as localfuncname
type procedure. It is unclear to me what the proper procedure for doing the same in Sage is — one can’t use the same syntax for a .sage
file, and for example attach('functions.sage')
and only works in interactive Sage and stomps local variables.
However after some Googling and experimentation, I have found one method that behaves in the way that I need: namely that local variables aren’t stomped, and Sage-style syntax, like expressing a rational as a fraction, is preserved. I don’t know if this is the best way to do it, but it seems to be working, so I thought I’d share it.
First write functions.sage
as though it were a module file.
def myfunc(y): var('n, x') z1 = y z2 = 1/2 return z1, z2
Then for the script where we want to use it (myscript.sage
), we preparse the Sage functions file into a Python file and copy it to a name that can be handled before importing it.
import os os.system('sage --preparse functions.sage') os.system('mv functions.sage.py functions.py') from functions import myfunc x = 2 y = 3 z1,z2 = myfunc(y) print(x) print(z2)
When run, myscript.sage
produces the following.
From the command-line
$ sage myscript.sage 2 1/2
From an interactive session:
sage: attach('myscript.sage') 2 1/2 sage: type(z2) <type 'sage.rings.rational.Rational'>
The script produces functions.py
, which looks like this:
# This file was *autogenerated* from the file functions.sage from sage.all_cmdline import * # import sage library _sage_const_2 = Integer(2); _sage_const_1 = Integer(1) def myfunc(y): var('n, x') z1 = y z2 = _sage_const_1 /_sage_const_2 return z1, z2
It has been working out for me so far, but it seems a strange way to go about things. I’d welcome any commenters who know of a nicer way.
—
Refs: Ask Sagemath.org
I came to this from another ask.sagemath.org question which cited this post. FWIW here is a solution that does not invoke `os.system()` or even need to write any intermediate files. This can be done because the Sage preparser is just a (very complicated) Python function which can be used directly; no need to use `sage –preparse`):
https://ask.sagemath.org/question/7867/importing-sage-files/?answer=48947#post-id-48947
Thank you!