Python: импортировать библиотеку с расширением не py - PullRequest
2 голосов
/ 23 марта 2012

Мне нужно импортировать библиотеку, которая называется functions.sage. Как мне это сделать? Я попробовал:

__import__('functions.sage')

, а также это:

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

Редактировать

На самом деле я хочу импортировать sage lib в sage. И эта библиотека содержит специфичный для мудреца код. Я устал выше вариантов в интерпретации мудреца. И оба дали мне «модуль без функций» или что-то вроде этого.

Ответы [ 4 ]

6 голосов
/ 23 марта 2012

Это не очень хорошая идея.(Это прямо на границе между ответом и комментарием, но я хотел привести примеры, которые трудно втиснуть в комментарий.)

Файл .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'>

Так или иначе, вы будете иметьпередать функции.sage через препарсер.

1 голос
/ 26 марта 2012

Сводка: чтобы загрузить функцию из библиотеки .sage в sage - нужно сначала проанализировать файл .sage - он создаст файл .py - а затем import .py файл.

Пример:

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

Таким образом, код .sage был выполнен в sage, а не в python, как это было бы, если бы кто-нибудь использовал ответ Свена Марнача (что абсолютно правильно - но я сформулировал вопрос неправильно - я забыл упомянуть что исходный код должен быть выполнен на python.

0 голосов
/ 23 марта 2012

Вы можете попробовать использовать execfile для чтения файла.Не использовал его раньше себя, но, похоже, он читает содержимое файла в локальную область.

0 голосов
/ 23 марта 2012

Если бы мне действительно нужно было это сделать, я бы, вероятно, пошел с

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

Это не совсем эквивалентно импорту, так как модуль не войдет в sys.modules, и онне будет там просматриваться, если уже загружено, но если вам нужны эти шаги, их легко добавить.

...