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)
while inotifywait -qqe close_write test.py; do ./test.py; done

Нужен пакет inotify-tools. Команда запускается в каталоге со скриптом или нужно поправить пути.

alozovskoy ★★★★★
()

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

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

anonymous
()

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

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

Это две строки получается. А зачем в конце первой одиночный амперсанд? А если без inotifywait, с тем что уже есть в системе сделать нельзя?

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


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

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

Не знаю, что у вас за редактор анон, может ваш вариант мне не подойдёт. У меня пока что есть то есть, среду разработки ставить не хочу.

hikikomori ★★★
() автор топика
Ответ на: комментарий от alozovskoy
$ while inotifywait -qqe close_write test.py; do ./test.py; done



Пока других вариантов нет, попробовал, но он после 1-2 сохранения запускает файл и вываливается в консоль, а не цикл.

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

Кажется разобрался, работает, но проверьте пожалуйста:

 while true; do inotifywait -qqe close_write test.py; ./test.py; done; 

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

Спасибо, буду пробовать. Правда где в gedit «управление внешними инструментами» я не нашёл. Вероятно нужно пойти глянуть на stackoverflow.

hikikomori ★★★
() автор топика
22 января 2017 г.
Ответ на: комментарий от 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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.