Latest posts on Динамическое выполнение кода с исходником в другом файле. topichttps://python.su/forum/topic/621/2007-04-01T13:35:47+03:00Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-04-01T13:35:47+03:00denz4324to xonix:<br/>К сожалению выполнять непосредственно из файлов я не могу - куски эти предварительно обрабатываются и в перспективе будут шаблонизироваться, а через временные файлы на диске я ходить не могу, т.к есть “угроза” использования флеш дисков.<br/><br/>to tabajara:<br/>Кто такой CodeObject? Не вижу такого в мануале. Есть только мутно документированный new.code().<br/><br/>В общем я пошел путем затягивания __builtins__ и self в compile(). Тащить туды все globals() не хочу, т.к. в перспективе встанет вопрос под названием security а куски кода будут писаться не мной. Текущий вариант правда тоже нифига не секьюрный….<br/><br/>P.S. Я почему именно так вопрос поставил - потому что, по сути, питон все время создает методы и создает их параметры, вот и стало интересно как это сделать руцями.<br/><br/>Всем спасибо за содействие.
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T20:21:52+03:00tabajara4301<blockquote><em>denz</em><br/>Неоптимально затягивать все глобалсы внутрь отдельно стоящего кода</blockquote>“затягивать все глобалсы внутрь отдельно стоящего кода” == “затягнути 1 вказівник розміром 4 байти”
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T20:17:02+03:00tabajara4300preprocessor_src - компільований кусок, який не приймає ніяких параметрів, тому і фунція нічо не приймає. Щоб вона шось приймала треба той compile замінити на CodeObject, що буде приймати параметри. Але ліпше мені здається той self передати в глобалс.
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T20:11:28+03:00xonix4299И что тут неоптимального, передаваться-то будут только ссылки на глобалзы, ничего копироваться при этом не будет, ведь…<br/><br/>Да и вообще можно попробовать другие пути выполнения таких файликов, начиная от примерно такого<br/>от<br/><div class="code"><pre><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">)</span>
<span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">):</span>
<span class="nb">__import__</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="nb">globals</span><span class="p">(),</span> <span class="nb">locals</span><span class="p">(),</span> <span class="p">())</span>
</pre></div>до<br/><div class="code"><pre><span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">):</span>
<span class="k">exec</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">,</span> <span class="nb">file</span><span class="p">))</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">()</span>
</pre></div>или просто<br/><div class="code"><pre><span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">):</span>
<span class="nb">execfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">DIR_WITH_PLUGINS</span><span class="p">,</span> <span class="nb">file</span><span class="p">)),</span> <span class="nb">globals</span><span class="p">(),</span> <span class="nb">locals</span><span class="p">())</span>
</pre></div><br/>код не тестировал
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T19:56:19+03:00denz4298Неоптимально затягивать все глобалсы внутрь отдельно стоящего кода, вместо того, чтобы втянуть кусок кода в существующий объект, в котором уже есть все окружение.<br/>Эти куски - они довольно маленькие, и их может быть очень много.
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T19:25:05+03:00xonix4297А что конкретно не оптимально?
Общий :: Python для экспертов :: Динамическое выполнение кода с исходником в другом файле.
2007-03-30T18:17:15+03:00denz4295Всем привет. Заранее благодарен за любые идеи.<br/>Нужно повыполнять кучу кусков кода, который хранится в разных файлах.<br/>В данный момент используется конструкция, написанная в соответствии с мануалом:<br/><br/>func=new.function(compile(preprocessor_src,filename,“exec”),{“global1”:some_var1,“global2”:some_var2})<br/>func()<br/><br/>Передаваемые global1 и global2 соответственно используются в кусках кода.<br/>Соответственно никаких других глобалов в этих кусках нет. Работает только голый питонический синтаксис.<br/>Можно импортировать туда все необходимые глобалсы. Но это ж неоптимально, учитывая, что код выполняется внутри объекта.<br/><br/>Меняем пусковую конструкцию на <br/><br/>func=new.function(compile(preprocessor_src,filename,“exec”),{“global1”:some_var1,“global2”:some_var2})<br/>func()<br/>self.preprocessor=new.instancemethod(func,self)<br/>self.preprocessor()<br/><br/>На что (очевидно) получаем от питона версии 2.4 ответ:<br/>TypeError: ?() takes no arguments (1 given)<br/><br/>Итаг вопрос:<br/>Как определить агрументы для self.preprocessor?