交互式Shell

在本教程的大部分内容中,我们假设您使用 sage 命令。这将启动ipythonshell的自定义版本,并导入许多函数和类,以便可以从命令提示符下使用它们。通过编辑 $SAGE_ROOT/ipythonrc 文件。启动Sage后,您将获得类似于以下内容的输出:

┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.0, Release Date: 2020-01-01                     │
│ Using Python 3.7.3. Type "help()" for help.                        │
└────────────────────────────────────────────────────────────────────┘


sage:

要退出Sage,请按Ctrl-D或键入 quitexit .

sage: quit
Exiting SAGE (CPU time 0m0.00s, Wall time 0m0.89s)

挂钟时间是挂在墙上的时钟所经过的时间。这是相关的,因为CPU时间不跟踪子进程(如GAP或Singular)使用的时间。

(避免用 kill -9 因为Sage可能不会杀死子进程(例如Maple进程)或清除来自 $HOME/.sage/tmp

你的Sage会议

会话是从启动Sage到退出Sage的输入和输出序列。Sage通过IPython记录所有Sage输入。事实上,如果您使用的是交互式shell(而不是笔记本界面),那么在任何时候您都可以键入 %history (或) %hist )以获取迄今为止键入的所有输入行的列表。你可以打字 ? 在Sage提示下,可以了解IPython的更多信息,例如,“IPython提供编号提示。。。具有输入和输出缓存。所有输入都被保存,并且可以作为变量检索(除了通常的箭头键调用)。以下全局变量始终存在(因此不要覆盖它们!)”:

_:  previous input (interactive shell and notebook)
__: next previous input (interactive shell only)
_oh : list of all inputs (interactive shell only)

下面是一个例子:

sage: factor(100)
 _1 = 2^2 * 5^2
sage: kronecker_symbol(3,5)
 _2 = -1
sage: %hist   #This only works from the interactive shell, not the notebook.
1: factor(100)
2: kronecker_symbol(3,5)
3: %hist
sage: _oh
 _4 = {1: 2^2 * 5^2, 2: -1}
sage: _i1
 _5 = 'factor(ZZ(100))\n'
sage: eval(_i1)
 _6 = 2^2 * 5^2
sage: %hist
1: factor(100)
2: kronecker_symbol(3,5)
3: %hist
4: _oh
5: _i1
6: eval(_i1)
7: %hist

在本教程的其余部分和其他Sage文档中,我们省略了输出编号。

您还可以将来自会话的输入列表存储在该会话的宏中。

sage: E = EllipticCurve([1,2,3,4,5])
sage: M = ModularSymbols(37)
sage: %hist
1: E = EllipticCurve([1,2,3,4,5])
2: M = ModularSymbols(37)
3: %hist
sage: %macro em 1-2
Macro `em` created. To execute, type its name (without quotes).
sage: E
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over
Rational Field
sage: E = 5
sage: M = None
sage: em
Executing Macro...
sage: E
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over
Rational Field

当shell使用Sage命令执行命令时,可以使用任何一个命令 ! . 例如,

sage: !ls
auto  example.sage glossary.tex  t  tmp  tut.log  tut.tex

返回当前目录的列表。

这个 PATH 前面有Sage bin目录,所以如果您运行 gpgapsingularmaxima 等等,你会得到Sage附带的版本。

sage: !gp
Reading GPRC: /etc/gprc ...Done.

                           GP/PARI CALCULATOR Version 2.2.11 (alpha)
                  i686 running linux (ix86/GMP-4.1.4 kernel) 32-bit version
...
sage: !singular
                     SINGULAR                             /  Development
 A Computer Algebra System for Polynomial Computations   /   version 3-0-1
                                                       0<
     by: G.-M. Greuel, G. Pfister, H. Schoenemann        \   October 2005
FB Mathematik der Universitaet, D-67653 Kaiserslautern    \

记录输入和输出

记录Sage会话与保存Sage会话不同(请参见 保存和加载完整会话 为此)。要记录输入(和可选的输出),请使用 logstart 命令。类型 logstart? 更多细节。您可以使用这个命令记录您输入的所有输入、所有输出,甚至在以后的会话中回放这些输入(只需重新加载日志文件)。

was@form:~$ sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.0, Release Date: 2020-01-01                     │
│ Using Python 3.7.3. Type "help()" for help.                        │
└────────────────────────────────────────────────────────────────────┘

sage: logstart setup
Activating auto-logging. Current session state plus future input saved.
Filename       : setup
Mode           : backup
Output logging : False
Timestamping   : False
State          : active
sage: E = EllipticCurve([1,2,3,4,5]).minimal_model()
sage: F = QQ^3
sage: x,y = QQ['x,y'].gens()
sage: G = E.gens()
sage:
Exiting SAGE (CPU time 0m0.61s, Wall time 0m50.39s).
was@form:~$ sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.0, Release Date: 2020-01-01                     │
│ Using Python 3.7.3. Type "help()" for help.                        │
└────────────────────────────────────────────────────────────────────┘

sage: load("setup")
Loading log file <setup> one line at a time...
Finished replaying log file <setup>
sage: E
Elliptic Curve defined by y^2 + x*y  = x^3 - x^2 + 4*x + 3 over Rational
Field
sage: x*y
x*y
sage: G
[(2 : 3 : 1)]

如果在linuxkde终端中使用Sage konsole 然后可以按如下方式保存会话:在中启动Sage之后 konsole ,选择“设置”,然后选择“历史记录…”,然后选择“设置无限制”。当您准备好保存会话时,选择“编辑”,然后选择“将历史记录另存为…”,然后键入一个名称,将会话的文本保存到您的计算机上。保存此文件后,您可以将其加载到一个编辑器(如xemacs)中并打印它。

粘贴忽略提示

假设您正在阅读Sage或Python计算的会话,并希望将它们复制到Sage中。但也有烦人的 >>>sage: 引起担忧。实际上,您可以将一个示例(包括提示)复制并粘贴到Sage中。换句话说,默认情况下,Sage解析器会去掉所有前导 >>>sage: 在传递给Python之前提示。例如,

sage: 2^10
1024
sage: sage: sage: 2^10
1024
sage: >>> 2^10
1024

定时命令

如果你把 %time 命令在输入行的开头,命令运行所需的时间将在输出后显示。例如,我们可以用几种方法比较某个求幂运算的运行时间。下面的时间安排在您的计算机上可能会有很大的不同,甚至在不同版本的Sage之间也是如此。首先,原生Python:

sage: %time a = int(1938)^int(99484)
CPU times: user 0.66 s, sys: 0.00 s, total: 0.66 s
Wall time: 0.66

这意味着总共花了0.66秒,“墙时间”,也就是说,你的挂钟所用的时间量,也是0.66秒。如果您的计算机上加载了大量其他程序,则墙时间可能远大于CPU时间。

也可以使用 timeit 尝试通过大量的命令迭代来获得大量的命令。这将提供稍有不同的信息,并且需要输入一个字符串和您想要计时的命令。

sage: timeit("int(1938)^int(99484)")
5 loops, best of 3: 44.8 ms per loop

下一步,我们使用本地Sage Integer类型(在Cython中)使用GMP库实现求幂:

sage: %time a = 1938^99484
CPU times: user 0.04 s, sys: 0.00 s, total: 0.04 s
Wall time: 0.04

使用PARI C-library接口:

sage: %time a = pari(1938)^pari(99484)
CPU times: user 0.05 s, sys: 0.00 s, total: 0.05 s
Wall time: 0.05

GMP更好,但只是稍微好一点(正如预期的那样,因为为Sage构建的PARI版本使用GMP进行整数运算)。

也可以使用 cputime 命令,如下所示:

sage: t = cputime()
sage: a = int(1938)^int(99484)
sage: b = 1938^99484
sage: c = pari(1938)^pari(99484)
sage: cputime(t)                       # somewhat random output
0.64
sage: cputime?
...
    Return the time in CPU second since SAGE started, or with optional
    argument t, return the time since time t.
    INPUT:
        t -- (optional) float, time in CPU seconds
    OUTPUT:
        float -- time in CPU seconds

这个 walltime 命令的行为与 cputime 命令,但它测量墙时间。

我们也可以在Sage包含的一些计算机代数系统中计算上述幂。在每种情况下,我们在系统中执行一个简单的命令,以便为该程序启动服务器。最相关的时间是墙时间。但是,如果墙时间和CPU时间之间存在显著差异,那么这可能表明存在值得研究的性能问题。

sage: time 1938^99484;
CPU times: user 0.01 s, sys: 0.00 s, total: 0.01 s
Wall time: 0.01
sage: gp(0)
0
sage: time g = gp('1938^99484')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.04
sage: maxima(0)
0
sage: time g = maxima('1938^99484')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.30
sage: kash(0)
0
sage: time g = kash('1938^99484')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.04
sage: mathematica(0)
        0
sage: time g = mathematica('1938^99484')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.03
sage: maple(0)
0
sage: time g = maple('1938^99484')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.11
sage: gap(0)
0
sage: time g = gap.eval('1938^99484;;')
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 1.02

注意GAP和Maxima是这个测试中最慢的(这是在机器上运行的 sage.math.washington.edu ). 由于pexpect接口的开销,将它们与最快的Sage进行比较可能是不公平的。

其他IPython技巧

如上所述,Sage使用IPython作为其前端,因此您可以使用IPython的任何命令和特性。你可以阅读 full IPython documentation . 同时,这里有一些有趣的技巧——这些在IPython中被称为“魔术命令”:

  • 你可以使用 %bg 在后台运行命令,然后使用 jobs 访问结果,如下所示。(评论 not tested 在这里是因为 %bg 语法不能很好地与Sage的自动测试工具配合使用。如果你自己输入这个,它应该能正常工作。当然,这对于需要一段时间才能完成的命令非常有用。)

    sage: def quick(m): return 2*m
    sage: %bg quick(20)  # not tested
    Starting job # 0 in a separate thread.
    sage: jobs.status()  # not tested
    Completed jobs:
    0 : quick(20)
    sage: jobs[0].result  # the actual answer, not tested
    40
    

    请注意,在后台运行的作业不使用Sage preparser—请参阅 预解析器:Sage和Python的区别 了解更多信息。解决这个问题的一个(也许很尴尬)方法是跑步:

    sage: %bg eval(preparse('quick(20)')) # not tested
    

    不过,它更安全更容易使用 %bg 不需要preparser的命令。

  • 你可以使用 %edit (或) %eded )打开一个编辑器,如果你想输入一些复杂的代码。在开始使用Sage之前,请确保 EDITOR 环境变量设置为您最喜欢的编辑器(通过 export EDITOR=/usr/bin/emacsexport EDITOR=/usr/bin/vim 或者类似的东西在适当的地方,比如 .profile 文件)。从Sage提示符,执行 %edit 将打开命名编辑器。然后可以在编辑器中定义函数:

    def some_function(n):
        return n**2 + 3*n + 2
    

    保存并退出编辑器。在剩下的Sage会话中,您可以使用 some_function . 如果要修改它,请键入 %edit some_function 从明智的提示。

  • 如果您有一个计算,并且要修改其输出以供其他用途,请执行计算和类型 %rep :这将把上一个命令的输出放在Sage提示符下,供您编辑。:

    sage: f(x) = cos(x)
    sage: f(x).derivative(x)
    -sin(x)
    

    此时,如果您键入 %rep 在Sage提示符下,您将得到一个新的Sage提示符,后面跟着 -sin(x) ,光标位于行尾。

更多信息,请键入 %quickref 获取IPython的快速参考指南。在撰写本文时(2011年4月),Sage使用IPython的0.9.1版本,并且 documentation for its magic commands 在线提供。魔法命令系统的各个稍微先进的方面都有记录 here 在IPython。

错误和异常

当出现问题时,通常会看到一个Python“异常”。Python甚至试图提出引发异常的原因。您经常会看到异常的名称,例如。, NameErrorValueError (请参见Python参考手册 [Py] 以获取完整的例外情况列表)。例如,

sage: 3_2
------------------------------------------------------------
   File "<console>", line 1
     ZZ(3)_2
           ^
SyntaxError: invalid syntax

sage: EllipticCurve([0,infinity])
------------------------------------------------------------
Traceback (most recent call last):
...
TypeError: Unable to coerce Infinity (<class 'sage...Infinity'>) to Rational

交互式调试器有时对理解出错的地方很有用。您可以使用 %pdb (默认设置为禁用)。提示 ipdb> 在引发异常且调试器处于打开状态时出现。在调试器中,可以打印任何局部变量的状态,并在执行堆栈中上下移动。例如,

sage: %pdb
Automatic pdb calling has been turned ON
sage: EllipticCurve([1,infinity])
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)
...

ipdb>

For a list of commands in the debugger, type ? at the ipdb> prompt:

ipdb> ?

Documented commands (type help <topic>):
========================================
EOF    break  commands   debug    h       l     pdef   quit    tbreak
a      bt     condition  disable  help    list  pdoc   r       u
alias  c      cont       down     ignore  n     pinfo  return  unalias
args   cl     continue   enable   j       next  pp     s       up
b      clear  d          exit     jump    p     q      step    w
whatis where

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

键入Ctrl-D或 quit 回到Sage身边。

反向搜索和制表符完成

反向搜索:键入命令的开头,然后 Ctrl-p (或只需按向上箭头键)返回以该方式开始的每一行。即使您完全退出Sage并稍后重新启动,也可以这样做。您也可以使用 Ctrl-r . 所有这些功能都使用 readline 包,在大多数Linux版本上都可用。

为了演示制表符的完成,首先创建三维向量空间 \(V=\QQ^3\) 如下:

sage: V = VectorSpace(QQ,3)
sage: V
Vector space of dimension 3 over Rational Field

您还可以使用以下更简洁的表示法:

sage: V = QQ^3

然后很容易列出的所有成员函数 \(V\) 使用制表符完成。只是打字 V. ,然后键入 [tab key] 键盘上的键:

sage: V.[tab key]
V._VectorSpace_generic__base_field
...
V.ambient_space
V.base_field
V.base_ring
V.basis
V.coordinates
...
V.zero_vector

如果键入函数的前几个字母,则 [tab key] ,则只获得按指示开头的函数。

sage: V.i[tab key]
V.is_ambient  V.is_dense    V.is_full     V.is_sparse

如果您想知道某个特定函数的作用,例如坐标函数,请键入 V.coordinates? 寻求帮助或 V.coordinates?? 对于源代码,如下一节所述。

集成帮助系统

Sage具有集成的帮助功能。键入函数名,后跟?用于该功能的文档。

sage: V = QQ^3
sage: V.coordinates?
Type:           instancemethod
Base Class:     <type 'instancemethod'>
String Form:    <bound method FreeModule_ambient_field.coordinates of Vector
space of dimension 3 over Rational Field>
Namespace:      Interactive
File:           /home/was/s/local/lib/python2.4/site-packages/sage/modules/f
ree_module.py
Definition:     V.coordinates(self, v)
Docstring:
    Write v in terms of the basis for self.

    Returns a list c such that if B is the basis for self, then

            sum c_i B_i = v.

    If v is not in self, raises an ArithmeticError exception.

    EXAMPLES:
        sage: M = FreeModule(IntegerRing(), 2); M0,M1=M.gens()
        sage: W = M.submodule([M0 + M1, M0 - 2*M1])
        sage: W.coordinates(2*M0-M1)
        [2, -1]

如上所示,输出告诉您对象的类型、在其中定义对象的文件,以及函数的有用描述,以及可以粘贴到当前会话中的示例。几乎所有这些例子都会定期进行自动测试,以确保它们的工作和行为完全符合要求。

另一个非常符合Sage开源特性的特性是如果 f 是一个Python函数,然后键入 f?? 显示定义 f . 例如,

sage: V = QQ^3
sage: V.coordinates??
Type:           instancemethod
...
Source:
def coordinates(self, v):
        """
        Write $v$ in terms of the basis for self.
        ...
        """
        return self.coordinate_vector(v).list()

这告诉我们 coordinates 函数的作用是调用 coordinate_vector 函数并将结果更改为列表。是什么 coordinate_vector 函数do?

sage: V = QQ^3
sage: V.coordinate_vector??
...
def coordinate_vector(self, v):
        ...
        return self.ambient_vector_space()(v)

这个 coordinate_vector 函数将其输入强制输入到环境空间中,这具有计算 \(v\) 依据 \(V\) . 空间 \(V\) 因为它只是 \(\QQ^3\) . 还有一个 coordinate_vector 函数,它是不同的。我们创建一个子空间并看到:

sage: V = QQ^3; W = V.span_of_basis([V.0, V.1])
sage: W.coordinate_vector??
...
def coordinate_vector(self, v):
        """
         ...
        """
        # First find the coordinates of v wrt echelon basis.
        w = self.echelon_coordinate_vector(v)
        # Next use transformation matrix from echelon basis to
        # user basis.
        T = self.echelon_to_user_matrix()
        return T.linear_combination_of_rows(w)

(如果您认为实现效率低下,请注册帮助优化线性代数。)

你也可以打字 help(command_name)help(class) 关于给定类的类似手册页的帮助文件。

sage: help(VectorSpace)
Help on class VectorSpace ...

class VectorSpace(__builtin__.object)
 |  Create a Vector Space.
 |
 |  To create an ambient space over a field with given dimension
 |  using the calling syntax ...
 :
 :

当你打字的时候 q to exit the help system, your session appears just as it was. The help listing does not clutter up your session, unlike the output of function_name? sometimes does. It's particularly helpful to type help(module_name). For example, vector spaces are defined in sage.modules.free_module, so type help(sage.modules.free_module) for documentation about that whole module. When viewing documentation using help, you can search by typing / and in reverse by typing `` ?``.

保存和加载单个对象

假设你计算一个矩阵或者更糟的,一个复杂的模符号空间,并且想保存它以备以后使用。你能做什么?计算机代数系统有几种保存单个对象的方法。

  1. 保存游戏: 只支持保存和加载完整的会话(例如GAP、Magma)。

  2. Unified Input/Output: 使每个对象以可读回(GP/PARI)的方式打印。

  3. Eval :易于在解释器中计算任意代码(例如,单数、PARI)。

因为Sage使用Python,所以它采用了一种不同的方法,即每个对象都可以被序列化,也就是说,转换成一个可以从中恢复对象的字符串。这在精神上类似于PARI的统一I/O方法,只是它没有对象打印到屏幕的方式过于复杂的缺点。另外,对保存和加载的支持(在大多数情况下)是完全自动的,不需要额外的编程;这只是Python的一个特性,它是从一开始就被设计成这种语言的。

几乎所有的Sage对象x都可以用压缩格式保存到磁盘上 save(x, filename) (或者在很多情况下 x.save(filename) ). 要重新加载对象,请使用 load(filename) .

sage: A = MatrixSpace(QQ,3)(range(9))^2
sage: A
[ 15  18  21]
[ 42  54  66]
[ 69  90 111]
sage: save(A, 'A')

你现在应该退出Sage重新开始。然后你就可以 A 背面:

sage: A = load('A')
sage: A
[ 15  18  21]
[ 42  54  66]
[ 69  90 111]

对于更复杂的对象,例如椭圆曲线,也可以这样做。缓存的对象的所有数据都与对象一起存储。例如,

sage: E = EllipticCurve('11a')
sage: v = E.anlist(100000)              # takes a while
sage: save(E, 'E')
sage: quit

保存的版本 E 需要153KB,因为它存储了前100000个字节 \(a_n\) 用它。

~/tmp$ ls -l E.sobj
-rw-r--r--  1 was was 153500 2006-01-28 19:23 E.sobj
~/tmp$ sage [...]
sage: E = load('E')
sage: v = E.anlist(100000)              # instant!

(在Python中,保存和加载是使用 cPickle 模块。尤其是Sage的东西 x 可以通过 cPickle.dumps(x, 2) . 注意 2 !)

Sage无法保存和加载在其他计算机代数系统中创建的单个对象,例如GAP、Singular、Maxima等。它们在标记为“无效”的状态下重新加载。在GAP中,虽然许多物体以一种可以重建的形式打印出来,但许多物体没有,所以故意不允许从它们的打印表示中重建。

sage: a = gap(2)
sage: a.save('a')
sage: load('a')
Traceback (most recent call last):
...
ValueError: The session in which this object was defined is no longer
running.

GP/PARI对象可以保存和加载,因为它们的打印表示足以重建它们。

sage: a = gp(2)
sage: a.save('a')
sage: load('a')
2

保存的对象可以稍后在具有不同体系结构或操作系统的计算机上重新加载,例如,您可以在32位OS X上保存一个巨大的矩阵,然后在64位Linux上重新加载,找到梯队形式,然后将其移回原位。此外,在许多情况下,您甚至可以将对象加载到Sage的版本中,而Sage的版本与保存对象的版本不同,只要对象的代码没有太大差异。对象的所有属性以及定义对象的类(但不是源代码)一起保存。如果Sage的新版本中不再存在该类,则无法在该新版本中重新加载该对象。但是你可以在旧版本中加载,获取对象字典(使用 x.__dict__ ),保存字典,并将其加载到新版本中。

另存为文本

您还可以将对象的ASCII文本表示形式保存到纯文本文件中,只需在写入模式下打开一个文件并写入对象的字符串表示形式(也可以用这种方式编写许多对象)。写完对象后,关闭文件。

sage: R.<x,y> = PolynomialRing(QQ,2)
sage: f = (x+y)^7
sage: o = open('file.txt','w')
sage: o.write(str(f))
sage: o.close()

保存和加载完整会话

Sage对保存和加载完整的会话有非常灵活的支持。

命令 save_session(sessionname) 将当前会话中定义的所有变量保存为给定 sessionname . (在极少数情况下,当一个变量不支持保存时,它不会被保存到字典中) .sobj 可以像其他保存的对象一样加载。加载会话中保存的对象时,会得到一个字典,其键是变量名,值是对象。

你可以使用 load_session(sessionname) 命令加载中定义的变量 sessionname 进入当前会话。请注意,这不会清除您在当前会话中定义的变量;相反,这两个会话将被合并。

首先我们启动Sage并定义一些变量。

sage: E = EllipticCurve('11a')
sage: M = ModularSymbols(37)
sage: a = 389
sage: t = M.T(2003).matrix(); t.charpoly().factor()
 _4 = (x - 2004) * (x - 12)^2 * (x + 54)^2

接下来,我们保存会话,它将上述每个变量保存到一个文件中。然后我们查看文件,它的大小约为3K。

sage: save_session('misc')
Saving a
Saving M
Saving t
Saving E
sage: quit
was@form:~/tmp$ ls -l misc.sobj
-rw-r--r--  1 was was 2979 2006-01-28 19:47 misc.sobj

最后,我们重新启动Sage,定义一个额外的变量,并加载保存的会话。

sage: b = 19
sage: load_session('misc')
Loading a
Loading M
Loading E
Loading t

每个保存的变量都将再次可用。此外,变量 b 未被覆盖。

sage: M
Full Modular Symbols space for Gamma_0(37) of weight 2 with sign 0
and dimension 5 over Rational Field
sage: E
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational
Field
sage: b
19
sage: a
389

旧式笔记本界面

本节指的是传统的Sage笔记本或“sagenb”。

SageMath正在过渡到使用 Jupyter notebook 作为默认值,它具有不同的结构。对于用户来说,最重要的区别是Jupyter中的单个工作表与其他文件一样保存在本地系统上,而Sage笔记本的主要访问点是通过服务器在下面描述的文件中。

传统SageNB笔记本

Sage笔记本是在启动Sage之后选择它来运行的 -n 选项。这将启动Sage笔记本并打开默认的web浏览器来查看它。服务器的状态文件存储在 $HOME/.sage/sage\_notebook.sagenb .

启动笔记本时,它首先在中创建以下文件 $HOME/.sage/sage_notebook.sagenb

conf.pickle
openid.pickle
twistedconf.tac
sagenb.pid
users.pickle
home/admin/ (a directory for the admin user)
home/guest/ (a directory for guests)
home/pub/ (a directory for published worksheets)

在创建了上述文件之后,笔记本启动了一个web服务器。

“笔记本”是用户帐户的集合,每个帐户可以有任意数量的工作表。创建新工作表时,定义该工作表的数据存储在 home/username/number 目录。在每个这样的目录中都有一个纯文本文件 worksheet.html -如果您的工作表、Sage或其他任何东西发生任何情况,那么这个人类可读的文件包含了重建工作表所需的所有内容。每个工作表还至少包含以下文件/文件夹:

cells/
worksheet.html
data/
worksheet_conf.pickle

从Sage内部输入 notebook? 了解更多关于如何启动笔记本服务器的信息。

下图说明了Sage笔记本的体系结构:

----------------------
|                    |
|                    |
|   firefox/safari   |
|                    |
|     javascript     |
|      program       |
|                    |
|                    |
----------------------
      |      ^
      | AJAX |
      V      |
----------------------
|                    |
|       sage         |                SAGE process 1
|       web          | ------------>  SAGE process 2    (Python processes)
|      server        |   pexpect      SAGE process 3
|                    |                    .
|                    |                    .
----------------------                    .

为了得到一个明智的命令, cmd ,在“笔记本浏览器”框中,键入 cmd? 现在开始攻击 <tab> (不是) <shift-enter>

有关笔记本界面中可用键盘快捷键的帮助,请单击 Help 链接。