【问题标题】:How to properly evaluate sage code from within a Python script如何从 Python 脚本中正确评估 sage 代码
【发布时间】:2014-08-26 20:36:12
【问题描述】:

我一直在尝试在 Python 中评估一个简单的“integrate(x,x)”语句,方法是按照将 Sage 导入 Python 的 Sage 说明进行操作。这是我的整个脚本:

    #!/usr/bin/env sage -python

from sage.all import *
def main():
    integrate(x,x)
    pass
main()

当我尝试从命令行运行它时,我得到了这个错误:

NameError: global name 'x' is not defined

我尝试将var(x) 添加到脚本global x 中,尝试将integrate(x,x) 替换为sage.integrate(x,x),但我似乎无法让它工作,我总是抛出错误。

我使用的命令是./sage -python /Applications/path_to/script.py

我似乎无法理解我在这里做错了什么。

编辑:我觉得这与我“进口”鼠尾草的方式有关。我有一个文件夹,我们称之为文件夹 1,文件夹 1 里面是“sage”文件夹和“script.py”

我之所以这么想是因为输入“sage”。不会出现任何自动完成选项。

【问题讨论】:

  • 为什么在另一个函数main中?
  • 我不明白你的意思。我尝试删除 def main(): 和 main() 行,但这并没有改变任何东西。
  • 我只是认为将代码放在 main() 函数中是惯例。我在 Python 之前学习 Java,没有 main() 代码就无法运行。
  • 我想集成本身就是一个函数,所以你可以直接调用它,文档没有显示任何用法,就像你上面所说的那样,我运行他们的例子没有问题。
  • 那么您能否解释一下我需要对代码进行的更改?

标签: python sage evaluate


【解决方案1】:

import sage.all 未导入名称 x。要定义变量x,您需要发出var 语句,如下所示

var('x')
integrate(x,x)

或者,更好,

x = SR.var('x')
integrate(x,x)

第二个示例不会在全局范围内自动注入名称 x,因此您必须将其显式分配给变量。

【讨论】:

  • 我会将您的答案标记为正确,但我想知道,所以没有办法从 python 中评估普通的圣人代码?因为在 sage 中,integrate(x,x) 可以在不将 x 声明为变量的情况下工作
  • 普通的sage代码不是python代码。例如,(1..2) 是有效的 sage 语法,而它在 python 中是语法错误。所以不,在 python 中运行“普通 Sage 代码”是没有意义的。如果你想执行 sage 代码,为什么不把它写在一个.sage 文件中呢?
  • 好点,Luca - 我认为这可能是唯一没有导入标准 Sage 会话中的全局命名空间的东西之一。你能想到其他人吗?
  • 想不出别的,我必须承认我很惊讶地发现它不是。
【解决方案2】:

Sage 的作用如下(参见文件src/sage/all_cmdline.py):

from sage.all import *
from sage.calculus.predefined import x

如果您将这些行放在 Python 文件中,那么 integrate(x,x) 将起作用。 (实际上,sage.calculus.predefined 只是使用sage.symbolic.ring 中的var 函数定义了x;这只是调用SR.var,正如另一个答案中所建议的那样。但是如果你想真正模仿Sage 的初始化过程,这两个行是你需要的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2011-01-25
    • 2011-01-14
    • 2021-03-22
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多