2012-03-23 93 views
2

我必须导入一个名为functions.sage的库。我该怎么做?我想:Python:导入一个带有非py扩展名的库

__import__('functions.sage') 

而且这样的:

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

编辑

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

+2

你看到了什么错误?我刚刚试验了你的第二个版本,成功 – 2012-03-23 13:25:31

+0

函数''真的包含纯Python代码?如果是的话,为什么它没有'.py'的扩展名? – 2012-03-23 13:29:16

回答

1

摘要:为了在sage.sage LIB加载功能 - 一个必须首先解析.sage文件 - 它将使一个.py文件 - 然后import.py文件。

例子:

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

这样的.sage代码鼠尾草得到执行 - 而不是蟒蛇 - 因为这将是如果将使用斯文Marnach的回答(这是绝对正确的 - 但是我说的问题一个错误的方式 - 我忘了提及代码的源代码必须在python中执行

0

如果我真的需要做到这一点,我可能会用

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

走这并不完全等同于进口,因为该模块将不会在sys.modules去了,也不会如果已经加载,那么在那里查找,但如果你需要这些步骤,它们很容易添加。

+0

嗯 - 没有一个Python代码:[sage](http: //en.wikipedia.org/wiki/Sagemath)代码 - 是Python的超集。但它的作品!非常感谢! – pvl 2012-03-23 13:46:03

0

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

+0

你说得对 - 参见斯文的回答。 +1 – pvl 2012-03-23 14:06:32

6

这不是一个好主意。 (这是正确的答案和注释之间的边界,但我想给辛苦的例子来塞进了评语)

的.sage文件或者包含鼠尾草特定的语法和行为或者事实并非如此。如果没有,你可以简单地将它重命名为.py,或者创建一个符号链接,或者其他任何东西。但是如果这样做的话,那么在它用Python工作之前,你将不得不先进行预处理。

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

x = 2/3 

,如果你将文件加载到圣人,你QQ的元素:

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

但在Python 2 ,你只需要int(0)。

它可能会使用鼠尾草风格的范围:

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

或其他贤者的特点:

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

和所有的这些都是由圣人预解析器处理,不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'> 

无论如何,你将不得不通过preparser传递functions.sage。

+0

+1同意。如果它是一个圣人文件,请使用圣人阅读它。如果它是一个Python文件,给它一个'.py'结尾。 – katrielalex 2012-03-23 13:58:45

+0

@DSM:确实应该准备文件 - 如果它有一个特定于鼠尾草的代码。但我实际上想要将一个圣人的lib导入圣人解释器。谢谢你的答案。 – pvl 2012-03-23 14:06:05

+0

@ user1207511:但execfile绕过Sage preparser。我会更新来解释。 – DSM 2012-03-23 14:13:26

相关问题