【发布时间】:2012-07-22 18:18:44
【问题描述】:
我安装了 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”不是全局名称的相同错误。
回复 DSM:我一直草率地描述问题,对此我深表歉意。我创建了一个新脚本“experiment.py”,它的第一行是“import jbom”。执行experiment.py 中的函数可以识别jbom.py 中的函数,但无法识别deepcopy。我尝试将 jbom.py 加载为“加载 jbom.py”,我可以像几个月前一样使用这些功能。那么,这只是一个分层脚本的问题,没有正确使用导入/加载等吗?
已解决:我在 jbom.py 的开头添加了“from sage.all import *”,现在我可以加载 Experiment.py 并执行调用 jbom.py 函数的函数而没有任何问题。从关于导入/加载的 Sage 文档中,我真的无法准确说出我做错了什么。
【问题讨论】:
-
你是如何安装 sage 的?从源代码编译?..我记得,它有自己的python和一切。您可以强制使用库存 python 运行旧脚本,以隔离问题。
-
“加载我的脚本”是什么意思? Sage 4.7.1 应该有
deepcopy可用。 -
我无法重现这个,尽管我手头最古老的 Sage 是 4.7.2。当我
load jbom.py时,一个单行程序print deepcopy对我有用(因为它是一个美化的execfile,所以deepcopy在范围内,即使它没有被预解析,因为它是一个.py文件),但不是当我导入它时(因为说 Python 模块不会神奇地访问 Sage 名称,并且需要from sage.all import *)。您能否从您的jbom.py文件中删除所有内容,除了重现问题所需的内容并粘贴?