Python:导入具有非py扩展名的lib

时间:2012-03-23 13:20:13

标签: python sage

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

__import__('functions.sage')

还有这个:

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

修改

实际上我想将sage lib导入sage。并且该lib包含特定于sage的代码。我厌倦了圣人解释的变种。两者都给了我'没有功能模块'或类似的东西。

4 个答案:

答案 0 :(得分: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 preparer处理,而不是由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。

答案 1 :(得分: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中执行。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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