Como processar um módulo Python a partir de um ficheiro

eu vi isto assim pergunta e tentei usá-lo criando um arquivo .py com 2 métodos e tentando lê-lo.
O ficheiro:

def f1(a):
    print "hello", a
    return 1

def f2(a,b):
    print "hello",a,", hello",b
Estou a tentar lê - lo.
>>> r = open('ToParse.py','r')
>>> t = ast.parse(r.read)

excepção projectada:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python26\lib\ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
TypeError: expected a readable buffer object
O que estou a fazer de errado?
meu objetivo é obter um módulo python e ser capaz de analisá - lo usando Python - expor suas classes e métodos.

Author: Community, 2013-03-20

4 answers

Se quiser expor dinamicamente as suas classes e métodos, então provavelmente terá de usar eval juntamente com compile.

Neste caso, pode fazê-lo como se segue.

Criar um ficheiro:

#test.py
def hello():
    print "hello"
E podes chamar-lhe assim:
#main.py
testContent = open("test.py").read()
#evaluate a content
eval(compile(testContent, "<string>", 'exec'))
#call function
hello() #prints hello

Editar : existe outra maneira de avaliar o ficheiro:

#main.py
#evaluate a content
eval(compile("import test", "<string>", 'exec')) #test.py
#check list of methods
dir(test) # ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'hello']
#call function
hello() #prints hello

sei que pode não ser uma boa escolha, mas não sei de outra maneira. Eu gostaria de ver outro solução

 1
Author: n1ckolas, 2013-03-20 10:06:40
Tens de ligar. Então a tua linha
t = ast.parse(r.read)

Deve ser

t = ast.parse(r.read())

Veja aquipara informações sobre ficheiros e aqui para informações sobre ast.parse

 6
Author: pradyunsg, 2013-03-20 08:59:03

Utilizar:

t = ast.parse(r.read()) # () is needed

Fonte: http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

 4
Author: Francesco Frassinelli, 2013-03-20 08:52:31

Está a tentar analisar a função lida no ficheiro.

Queres

t = ast.parse(r.read())

Ou (para seguir mais de perto o exemplo)

text = r.read()
ast.parse(text)

Não

t = ast.parse(r.read)
 2
Author: davidcorne, 2013-03-20 08:58:19