Форум сайта python.su
В общем подскажите как сделать сабж?
Цель такая: скрипт выполняет какой-то алгоритм. в определенный момент приходит команда на смену алгоритма.
скрипт должен изменить текст алгоритма (например из файла) и запустить его на выполнение.
поможет ли здесь import?
Отредактировано (Авг. 6, 2010 20:00:52)
Офлайн
s = '''print 'go'
x = 9
print x**0.5
'''
exec s
Отредактировано (Авг. 6, 2010 17:55:06)
Офлайн
О, у меня похожий вопрос, с областями видимости при исполнении кода из строки.
test.py:
s='bla-bla'
e='print s'
from modul import Run
Run(e)
modul.py:
def Run(e): exec(e)
test.py:
menu_argv=[
['-u','print "from url:",CpArg(2)'],
['-l','print "from file:",CpArg(2)'],
['','MenuRun(menu_main)']]
menu_main=[
['1','1. First command','print "menu 1"'],
['2','2. Second command','print "menu 2"'],
['','','print "no variants of menu"']]
from mymodul import MenuCp, MenuRun, CpArg
MenuCp(menu_argv)
mymodul.py:
import sys
def CpArg(x): # возвращает аргумент х командной строки или '', если аргумента нет
if len(sys.argv)<=x: return ''
else: return sys.argv[x]
def MenuRun(items): # пользовательское меню
l=len(items)-1
a=xrange(l)
for i in a: print(items[i][1])
print('select variant:'),
v=raw_input()
for i in a:
if items[i][0]==v: l=i
exec items[l][2]
def MenuCp(items): # меню аргументов CommandPrompt (потом объединю с верхним)
l=len(items)-1
a=xrange(l)
for i in a:
if items[i][0]==CpArg(1): l=i
exec items[l][1]
Отредактировано (Авг. 11, 2010 22:06:26)
Офлайн
Уже в кровати такая идея пришла в голову. Не запускать на выполнение текстовый кусок кода в модуле, а возвращать его текстом в… main (кстати, а как в питоне называется основной, запускной блок?)
test.py:
s='bla-bla'
e='print s'
from modul import Run
exec Run(e)
modul.py:
def Run(e): return е
Отредактировано (Авг. 12, 2010 00:26:06)
Офлайн
А кто мешает s передать вторым параметром?
Офлайн
Там:
def run(code, **local_ns):
local_ns = local_ns.copy() # что бы изменения не вернулись, просто так
exec(code, None, local_ns)
run('print s', s = 'bla-bla')
Офлайн