2

我必须导入名为functions.sage. 我该怎么做?我试过:

__import__('functions.sage')

还有这个:

import imp
imp.load_source('fun', 'functions.sage')

编辑

实际上我想将sage lib 导入到 sage 中。该库包含特定于圣人的代码。我厌倦了圣人解释的上述变体。两者都给了我“无功能模块”或类似的东西。

4

4 回答 4

6

这不是一个好主意。(这正好在答案和评论之间,但我想举一些很难塞进评论的例子。)

.sage 文件要么包含 Sage 特定的语法和行为,要么不包含。如果没有,您可以简单地将其重命名为 .py,或创建符号链接,或其他任何方式。但如果是这样,那么无论如何你都必须先对它进行预解析,然后它才能在 Python 中工作。

例如,如果“functions.sage”文件写道:

x = 2/3

如果你把文件加载到sage中,你会得到一个QQ的元素:

sage: x
2/3
sage: parent(x)
Rational Field

但在 Python 2 中,您只需得到 int(0)。

它可能使用 Sage 风格的范围:

sage: [1,3,..,11]
[1, 3, 5, 7, 9, 11]

或其他 Sage 功能:

sage: F.<x,y> = GF(2)[]
sage: F
Multivariate Polynomial Ring in x, y over Finite Field of size 2

所有这些都由 Sage 预解析器处理,而不是由 Python。在幕后,它是这样做的:

sage: preparse("F.<x,y> = GF(2)[]") 
"F = GF(Integer(2))['x, y']; (x, y,) = F._first_ngens(2)"

更新:显然我没有把问题说清楚。

sage: import imp 
sage: !cat functions.sage 
x = 2/3
sage: functions = imp.new_module("functions")                         
sage: execfile("functions.sage", vars(functions))          
sage: dir(functions)
['__builtins__', '__doc__', '__name__', '__package__', 'x']
sage: functions.x
0
sage: type(functions.x)
<type 'int'>

一种或另一种方式,您将不得不通过预解析器传递functions.sage。

于 2012-03-23T13:43:40.503 回答
1

摘要:为了从一个.sage库中加载一个函数sage- 必须先解析.sage文件 - 它会生成一个.py文件 - 然后import.py文件。

例子:

import os
os.system(os.curdir + os.sep + 'functions.sage')
from functions import states

通过这种方式,.sage代码在 sage 中执行 - 而不是在 python 中 - 就像使用 Sven Marnach 的答案一样(这是绝对正确的 - 但我以错误的方式陈述了这个问题 - 我忘了提到代码的源代码必须在python中执行。

于 2012-03-26T10:59:09.893 回答
0

如果我真的需要这样做,我可能会选择

functions = imp.new_module("functions")
execfile("functions.sage", vars(functions))

这并不完全等同于导入,因为模块不会进入sys.modules,如果已经加载,也不会在那里查找,但是如果您需要这些步骤,它们很容易添加。

于 2012-03-23T13:25:32.390 回答
0

您可以尝试使用execfile来读取文件。在我之前没有使用过它,但看起来它会将文件内容读入本地范围。

于 2012-03-23T13:28:34.783 回答