0

我安装了 Sage 4.7.1 并遇到了一个奇怪的问题。我的许多使用 deepcopy() 和 uniq() 等函数的旧脚本不再将它们识别为全局名称。我已经能够通过一个一个地导入 python 模块来解决这个问题,但这很乏味。但是当我启动命令行 Sage 界面时,我可以在不导入复制模块的情况下键入“list2=deepcopy(list1)”,而且效果很好。命令行 Sage 怎么可能识别全局名称“deepcopy”,但如果我加载使用相同名称的脚本,它就无法识别它?

哎呀,对不起,还不熟悉stackoverflow。我输入:“sage_4.7.1/sage”来启动命令行界面;然后,我输入“load jbom.py”来加载我在python脚本中定义的所有函数。当我使用脚本中的一个函数时,它运行了几秒钟(复杂函数),然后到达我使用 Sage 通常作为全局名称(deepcopy、uniq 等)的一些函数的位置,但由于某种原因,我加载的脚本不知道函数是什么. 重申一下,正如我所描述的,我的脚本 jbom.py 曾经在我上次从事这项特定研究时工作。

如果我使用“load jbom.py”或“import jbom”也没有区别。这两种方法都获得了我在脚本中定义的函数(但在第二种情况下我必须使用 jbom。)并且都得到关于“deepcopy”不是全局名称的相同错误。

回复帝斯曼:我一直草率地描述了这个问题,对此我深表歉意。我创建了一个新脚本“experiment.py”,它的第一行是“import jbom”。执行experiment.py 中的函数可以识别jbom.py 中的函数,但无法识别deepcopy。我尝试将 jbom.py 加载为“加载 jbom.py”,我可以像几个月前一样使用这些功能。那么,这只是在没有正确使用导入/加载等的情况下分层脚本的问题吗?

已解决:我在 jbom.py 的开头添加了“from sage.all import *”,现在我可以加载 Experiment.py 并执行调用 jbom.py 函数的函数而没有任何问题。从关于导入/加载的 Sage 文档中,我无法真正说出我到底做错了什么。

4

1 回答 1

0

好的,这是发生了什么:

您只能使用以( ignoring )import结尾的文件。这些是标准 Python 文件,未预解析,因此, not ,并且您没有可玩的 a 等价物。.py.py[co]1/3 == int(0)QQ(1)/QQ(3)from sage.all import *

您可以loadand attachboth .pyand.sage文件(以及.pyxand .spyxand .m)。两者都可以访问 Sage 定义,但.py文件没有预解析(因此y=17生成yPython int),而.sage文件是(因此y=17生成ySage Integer)。

所以import jbom这里的工作方式就像它在 Python 中一样,您无法访问 Sage 已放入范围内的内容。 load等很方便,但它们不能很好地扩展到更大的程序。我过去曾提议改进这一点,让.sage脚本不再是二等公民,但还没有就该做什么和做这件事的精力达成一致。与此同时,您最好的选择是从sage.all.

于 2012-07-22T19:35:32.300 回答