Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2013 21:03:17

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

Добрый день! Столкнулся с проблемой. Пользователь вводит пример кода на питоне, который сохраняется в базе данных в виде строки.
Например.

"""
def test():
	r = 5
	pi = 3.14
	s = pi*r^2
	return s
test()
""""

Программа берет строку из БД. Далее нужно воспроизвести данный код на сервере и вернуть результат в БД. Какими средствами это можно реализовать?
Нашел функции eval и exec, но что то у меня с ними не складывается. Точнее понятно все более-менее, но не понятно почему не возвращается значение.
Например после выполнения возвращается None.. Что я делаю не так и как это сделать более-менее по уму? Заранее спасибо!
a = """
def test():
	r = 5
	s = r*r
	return s
test()
"""
print (exec(a))

Офлайн

#2 Май 2, 2013 22:19:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

a = """
def test():
    r = 5
    s = r*r
    return s
cc=test()
"""
exec(a)
print cc
exec ничего не возвращает смотрите внимательнее документацию.



Офлайн

#3 Май 2, 2013 22:54:29

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

спасибо. Тогда не подскажете, как мне все же доставать конечный результат без внесения изменений в исходный код?

Офлайн

#4 Май 3, 2013 07:24:18

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

a = """
def test():
    r = 5
    s = r*r
    return s
cc=test()
"""
def do():
    c=a.lstrip("'''")
    b=c.rstrip("'''")
    exec(b)
    return cc
print do()

Офлайн

#5 Май 3, 2013 07:59:21

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

a = """
def test():
    r = 5
    s = r*r
    return s
cc=test()
"""
code_obj = compile(a, '<string>', 'exec')
exec(code_obj)
print cc

отсюда
http://python-lab.blogspot.com/2012/05/exploring-python-code-objects.html
http://python-lab.blogspot.com/2012/05/exec-pythona.html

Отредактировано sanodin (Май 3, 2013 08:05:49)

Офлайн

#6 Май 3, 2013 09:08:25

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

Разобрался. Тему можно закрывать.
Решение нашел здесь.

Отредактировано ahpex (Май 3, 2013 09:48:29)

Офлайн

#7 Май 3, 2013 09:48:10

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Удаленное исполнение строки

ahpex
Можно ли каким то образом извлечь результат (в дан. случ. - 25) не прибегая к внесению переменных и тд.?
Невозможно, т.к. он нигде не сохраняется.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version