2012-03-23 96 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

相關問題