LINUX.ORG.RU

перезапуск скрипта после сохранения

 ,


1

2

Подскажите пожалуйста, на что в скрипте ниже можно заменить sleep 3; или вообще как весь скрипт переписать с тем, чтобы он перезапускал test.py при изменении у него времени сохранения?
То есть в окне редактора я его правлю, сохраняю, и в соседнем окне с терминалом он сразу перезагружается.

 $ while true; do ./test.py; sleep 3; done;


нужно именно элегантное решение в одну строку для удобства копипасты.

или вообще как весь скрипт переписать с тем, чтобы он перезапускал test.py при изменении у него времени сохранения?

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

inotify, icrond — повесить на запись в test.py запуск test.py

типа icrontab -e:

/path/to/test.py IN_CLOSE_WRITE python /path/to/test.py
Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 1)

То есть в окне редактора я его правлю, сохраняю

лучше уж в редакторе назнавить комбинацию на сохранение и запуск

anonymous ()

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

anonymous ()
Ответ на: комментарий от Psych218
icrontab -e: /path/to/test.py IN_CLOSE_WRITE python /path/to/test.py


Непонятно, это процесс вешается, или в консоли выполняется непрерывно? Мне бы такое, чтобы без дополнительного софта можно было запустить в любой консоли, и не всегда моей.

hikikomori ()
Ответ на: комментарий от hikikomori

нильзя

самый нормальный вариант - у jollheef, остальных даже не слушай. единственное, я бы к его варианту ещё добавил "-e close_write" после «inotifywait». типа такого

while true; do inotifywait -e close_write test.py; pkill -f 'python test.py'; echo -e '   ***\n'; python test.py&; done

тока если у тебя в коде бесконечный цикл, то выходить из ^ этого цикла надо будет либо по <Ctrl+C>, «fg»<Enter>, <Ctrl+C> (если у тебя zsh, то проще: <Ctrl+C>, <Ctrl+Z>, <Ctrl+C>), либо убирать бесконечный цикл в петоновском скрипте и тогда однократно <Ctrl+C>.

а редактор у меня простой, абычный, не иде. да щас любой редактор, мне кажется, умеет запускать команды.

anonymous ()
Ответ на: комментарий от anonymous

Почему нельзя? Ведь работает. Выход просто по ^C. ЧяДНТ?
Ваш вариант дал ошибку bash: ошибка синтаксиса около неожиданной лексемы `;'

У меня gedit, где там что навесить можно? Хотя в отдельном окне удобнее.

hikikomori ()
Ответ на: комментарий от hikikomori

Почему нельзя? Ведь работает.

что нельзя?

а что, если в твоём скрипте будет бесконечный цикл? или там сервер какой надумаешь делать? как тогда свой скрипт перезапускать будешь? попробуй на простом примере:

from time import sleep
white True:
    print('endless poop')
    sleep(1)

В случае с (теперь работает и в баше)

while true; do inotifywait -qqe close_write test.py; pkill -f 'python test.py'; echo -e '\n***\n'; { python test.py& }; done
достаточно просто пересохранить файл и скрипт запустится по новой.

теперь переведу ответ со stackoverflow про то, как сделать запуск скрипта по кнопке. 1) открой «управление внешними инструментами» (Manage External Tools), 2) добавь инструмент, 3) назови его, 4) впиши вот это:

#!/bin/sh
python $GEDIT_DOCUMENTS_PATH
# вариация: python3 "$GEDIT_CURRENT_DOCUMENT_PATH"
5) назначь клавишу, например F5, нажав её прямо в соответствующем поле ввода.

ещё пара ссылок, которые помогут сориентироваться: одна, вторая.

anonymous ()
Ответ на: комментарий от anonymous

Заметил странный глюк. Поначалу убил мозг, пытаясь понять почему так.

Запускаю:

while true; do inotifywait -qqe close_write test.py; pkill -f 'python3 test.py'; echo -e '\n***\n'; { python3 test.py& }; done


Но если в скрипте встречается input() то он становится бесконечным, пока не нажмешь ^c

А запуск непосредственно в gedit по F5 выдаёт ошибку EOFError: EOF when reading a line

Видимо input() не умеет обрабатывать.

hikikomori ()
Последнее исправление: hikikomori (всего исправлений: 1)