Найти - Пользователи
Полная версия: Как выполнить скрипт питона без компиляции в байт код
Начало » Python для новичков » Как выполнить скрипт питона без компиляции в байт код
1 2
Budulianin
erebus
Не из самой программы, я имел в виду: приостановить программу->изменить код->продолжить выполнение.

Ты сейчас про дебаггер говоришь, если конечно знаешь, что это такое.
erebus
Singularity
хочешь дебагер
именно

Budulianin
Таки знаю, но не знаю как реализовать это в дебагере. Ибо продолжить выполнение нужно именно с места остановки, не теряя имеющиеся данные, но уже измененную программу.

o7412369815963
erebus
Почему тогда говорят что исходный код на Python интерпритируеться а на Java - компилируеться?
байткод java вроде компиллируется в машинный байт-код уже на месте запуска.

erebus
Ибо продолжить выполнение нужно именно с места остановки, не теряя имеющиеся данные, но уже измененную программу.
Это может быть не возможно т.к. программа может быть кардинально изменена - тогда не понято что делать при продолжении или бессмысленно.
Если места остановки будут “предопределенные”, тогда можно частично решить задачу, но это не про дебагер.

erebus
не теряя имеющиеся данные
Некоторые задачи можно решить так:
* Сбрасывать дамп данных в файл когда программа останавливается, и восстанавливать данные при запуске.
* Функционал делать оторванным - вызывать через celery или типа того. Тогда можно изменять функционал без перезагрузки основной программы.

doza_and
erebus
приостановить программу->изменить код->продолжить выполнение.
Именно это обычно и делается при работе практически из любой среды отладки. Для этого достаточно просто в отладчике выполнить питон код который изменит нужные вам определения. (Исходный текст программы можно менять, а можно и не менять)
Budulianin
o7412369815963
байткод java вроде компиллируется в машинный байт-код уже на месте запуска.

Байт-код и машинный код - разные вещи. JIT компилирует в машинный код.
bw
Теоретически такое возможно, но нужно хорошо знать внутренности интерпретатора, что бы не напортачить (и всё равно напортачишь). Из чистого Python не получится конечно, придётся использовать API CPython. В частности придётся править фреймы после перекомпиляции, а стеков может быть несколько: системные потоки, greenlet-ы, yield-ы. Ну и нужно понимать, как искать новую точку остановки после перекомпиляции, например при 100% изменении кода, это сделать будет невозможно.

Если точка остановки не произвольная, а предопределённая, то может получиться проще: сериализация, “перезагрузка” и всё что нужно, десериализация.

..bw
Singularity
erebus
именно
Подробный ман http://habrahabr.ru/post/104086
Хотя если точка останова одна, то
import pdb;  pdb.set_trace()
а еще можно поставить ipdb тоже самое + автокомплит в консоли и еще что-то мб
erebus
Всем огромное спасибо за помощь. Ответ на вопрос в общих чертах ясен: изменять код программы во время её исполнения теоретически можно, но без особой нужды не стоит.
bw
Посмотрите пакеты `byteplay`, `astoptimizer`, `withhacks` и пр. Может подчерпнёте для себя что-то полезное.

..bw
erebus
bw
Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB