как перезапустить скрипт python

Перезапустите Python-скрипт изнутри себя

У меня есть приложение GTK на основе Python, которое загружает несколько модулей. Он запускается из терминала (linux) следующим образом:

Так что я не могу найти / нужно, это хорошая процедура перезапуска, которая убивает текущий экземпляр программы и запускает новый, используя те же аргументы.

Предпочтительно решение должно работать и для Windows, и для Mac, но это не обязательно.

9 ответов

Я немного улучшил код # s3niOr.

В моем случае в пути к файлу python есть пробелы. Таким образом, добавив правильное форматирование, проблема может быть решена.

Обратите внимание, что в моем случае мой файл python не имеет других аргументов. Так что, если у вас есть другие аргументы, вы должны разобраться с ними.

Это решает проблему перезапуска скрипта Python с пробелами в пути:

У меня есть runme.sh

Но это не перезапустило само приложение, следуя runme.sh, поэтому, когда я использовал этот способ:

Тогда я смог перезагрузить себя

Я знаю, что это решение технически не то, что вы просите, но если вы хотите быть на 100% уверены, что вы все освободили или не хотите полагаться на зависимости, вы можете просто запустить скрипт из цикла в другом:

Затем вы можете перезапустить main.py так же просто, как:

Я искал решение для этого и не нашел ничего, что работает ни на одном из сообщений переполнения стека. Может быть, некоторые ответы слишком устарели, например, os.system была заменена подпроцессом. Я нахожусь на Linux Lubuntu 17.10, используя Python 3.

Два метода работали для меня. Оба откройте новое окно оболочки и запустите в нем скрипт main.py, а затем закройте старый.

Адаптировано из метода @YumYumYum. Мне не нужна была опция kill (хотя она все равно не убивала мой процесс python по имени, и мне пришлось использовать killall python3 для достижения этого при тестировании).

Я использую lxterminal, но вы можете использовать любой.

В файле с именем restart.sh (chmod + x, чтобы сделать его исполняемым)

Затем в main.py используйте это, когда вам нужно вызвать его

Адаптировано из метода @Stuffe. Этот файл является внутренним по отношению к сценарию main.py и открывает новое окно оболочки, затем запускает новый сценарий, а затем выходит из старого сценария. Я не уверен, что ему нужна задержка времени. Но я все равно использовал его.

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

Таким образом, пользователь может ввести опцию «Y / N», чтобы перезапустить программу или нет.

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

Источник

Restart python-script from within itself

I have a python-based GTK application that loads several modules. It is run from the (linux) terminal like so:

From within the program the user can download (using Git) newer versions. If such exists/are downloaded, a button appear that I wish would restart the program with newly compiled contents (including dependencies/imports). Preferably it would also restart it using the contents of sys.argv to keep all the flags as they were.

So what I fail to find/need is a nice restart procedure that kills the current instance of the program and starts a new using the same arguments.

Preferably the solution should work for Windows and Mac as well but it is not essential.

SBmBZ

12 Answers 12

You’re looking for os.exec*() family of commands.

To restart your current program with exact the same command line arguments as it was originally run, you could use the following:

I think this is a more elaborate answer, as sometimes you may end up with too many open file objects and descriptors, that can cause memory issues or concurrent connections to a network device.

tor8J

And i have server.py where i need to restart the application itself, so i had:

but that did not restart the application itself by following runme.sh, so when i used this way:

Then i was able to restart itself

I know this solution isn’t technically what you are asking for but if you want to be 100% sure you freed everything or don’t want to rely on dependencies you could just run the script in from a loop in another:

Then you can restart main.py as simply as:

For me this part worked like a charm:

Works at Windows (Without args)

I have just a little amelioration on the code of #s3niOr.

In my case there are spaces in the path of the python file. So by adding a proper formatting, the problem can be solved.

Notice that in my case my python file has no other arguments. So if you do have other arguments, you have to deal with them.

This solves the problem of restarting a python script that has spaces in its path :

I was looking for a solution to this and found nothing that works on any of the stack overflow posts. Maybe some of the answers are too out of date, e.g. os.system has been replaced by subprocess. I am on linux lubuntu 17.10, using python 3.

Two methods worked for me. Both open a new shell window and run the main.py script in it and then close the old one.

Adapted from @YumYumYum method. I did not need the kill option, (though it did not kill my python process by name anyway and I had to use killall python3 to achieve it when testing).

I use lxterminal but you could probably use any.

In the file called restart.sh (chmod +x to make it executable)

Then in the main.py use this when you need to call it

2. From within main.py

Adapted from @Stuffe method. This one is internal to the main.py script and opens a new shell window then runs the new script, then quits out of the old script. I am not sure it needs the time.sleep delay but I used it anyway.

mjHhZ

Inspired by @YumYumYum and fixed the problem Using restart.sh and os.execl

Add this to your main.py

photo

I’m using this to give an option for the users to restart the script within the console. Hope it could be a help.

So the user can input an option ‘Y/N’ to restart the program or not.

photo

The old answers utilize exec which is fine, but not scalable in the long run. There’s also an approach of master/slave process relationship or a daemon/service in the background which will watch for the changes but is mostly OS specific or even different between the same family of OSs (init.d vs systemd vs whatever).

There’s also a middle ground by using a bootstraping technique and a simple subprocess.Popen() call thus assuming that the user who started the original program had the permissions to run the executable (such as /usr/bin/python ) should also work without any permission errors due to utilizing the exactly same executable. Bootstraping because it’s the main program that’s creating and calling the restarter a.k.a. pulling itself by own bootstraps after the initial start.

So a simple program (re)starter can be written like this, as written in the other answers:

Depending on your needs you might want to do some cleanup afterwards such as removing the (re)starter file.

This allows you to register a function that will execute once your program stops. That function can be anything in Python, so it can write a file too.

Источник

Как сделать программу Python автоматически перезапустить себя

Как сделать так, чтобы программа на python автоматически перезапускала себя? Итак, скажем, есть действительно простая программа, такая как:

Теперь в оболочке Python вам нужно будет нажать либо кнопку «Выполнить», а затем «Запуск модуля (F5)», либо просто кнопку «f5» на клавиатуре. Это первый раз, когда вы запускаете его. Когда программа закончилась, вы вернетесь к своему файлу «Cheese.py» и затем нажмите «f5», чтобы снова запустить программу. Все со мной здесь? Итак, мой вопрос: как заставить программу автоматически перезагружаться без необходимости делать это вручную?

4 ответа

Если вы хотите фактически перезапустить сценарий, вы можете выполнить сценарий снова, заменив текущий процесс новым, выполнив следующие действия:

Это будет постоянно перезапускать скрипт, предоставляя аргументы командной строки от текущей версии к новой версии. Более подробное обсуждение этого метода можно найти в посте «Перезапуск скрипта Python внутри себя »от Петр Земек.

эта статья отмечает один элемент является:

Или вы можете попробовать

Затем вы можете запустить скрипт через

В такой ситуации, чтобы перезапустить скрипт, используйте следующий код:

В противном случае, когда вы запускаете скрипт через

Используйте этот код:

В любом случае, не забудьте импортировать sys module

Я использую терминал на своем Mac, чтобы перезапустить некоторые из моих скриптов на Python с помощью функции ниже.

Примечание: не забывайте пробел после «профиля»; или функция может молча сбоить!

Затем в нижней части моего сценария нужно перезапустить:

Исходный вопрос о сценарии с сыром:

Источник

Перезапустите python- script изнутри самого себя

У меня есть приложение GTK на основе python, которое загружает несколько модулей. Он запускается с терминала (linux) следующим образом:

Так что я не могу найти/нужна хорошая процедура перезапуска, которая убивает текущий экземпляр программы и запускает новый, используя те же аргументы.

Предпочтительно, решение должно работать и для Windows и Mac, но это не существенно.

ОТВЕТЫ

Ответ 1

Ответ 2

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

Ответ 3

но это не перезапустило само приложение, выполнив команду runme.sh, поэтому, когда я использовал этот способ:

Затем я смог перезапустить себя

Ответ 4

Я знаю, что это решение технически не является то, о чем вы просите, но если вы хотите быть на 100% уверенным, что вы освободили все или не хотите полагаться на зависимости, вы можете просто запустить script из цикла в другой:

Затем вы можете перезапустить main.py так же, как:

Ответ 5

Я немного улучшил код # s3niOr.

В моем случае в пути к файлу Python есть пробелы. Таким образом, добавив правильное форматирование, проблема может быть решена.

Обратите внимание, что в моем случае мой файл python не имеет других аргументов. Так что, если у вас есть другие аргументы, вы должны разобраться с ними.

Это решает проблему перезапуска скрипта Python с пробелами в пути:

Ответ 6

Работает на Windows (без аргументов)

Ответ 7

Вдохновлен @YumYumYum и исправил проблему с помощью restart.sh и os.execl

Добавьте это в ваш main.py

Ответ 8

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

Таким образом, пользователь может ввести опцию «Y/N», чтобы перезапустить программу или нет.

Источник

Как автоматически перезапустить скрипт Python, если он был убит или умер

Я запускаю свой сценарий Python в фоновом режиме на моем компьютере с Ubuntu (12.04) следующим образом:

Теперь может быть возможно, что на каком-то этапе мой выше Python script может умереть по любой причине.

Так что я думаю иметь какой-то cron agent скрипт в bash shell, который может автоматически перезапустить мой вышеописанный скрипт на Python, если он по какой-либо причине будет убит

Возможно ли это сделать? Если да, то как лучше всего решить эту проблему?

ОБНОВИТЬ:

Я запустил команду sudo, чтобы запустить ее, но я не вижу, как этот процесс выполняется с использованием ps ax?

Есть идеи, почему px axe мне ничего не показывает? И как я могу проверить, работает ли моя программа или нет?

В Ubuntu (до 14.04, 16.04 и позже используйте systemd) можно использовать upstart для этого лучше, чем задание cron. Вы вводите настройки конфигурации /etc/init и убедитесь, что вы задаете респаун

Это может быть минимальный файл /etc/init/testing.conf (отредактируйте как root ):

И вы можете проверить с /your/base/directory/testing.py :

и следите за тем, что происходит (в другом окне), с помощью:

Вы также можете добавить [start on][2] команду запуска при загрузке системы.

Вы также можете использовать более ориентированный на оболочку подход. Найдите свой cron сценарий и перезапустите его, если он умрет.

Добавьте эту строку в файл, который только что открылся

Сохраните файл и выйдите из редактора.

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

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

Вы не должны действительно использовать это для производства, но вы могли бы:

Но вы можете посмотреть на альтернативы init и в коде Python для Pardus: в частности, mudur daemon.

Если вы решите пойти с заданием cron (и обработкой файла PID), подумайте о том, чтобы прочитать этот PEP 3143 и, возможно, использовать его эталонную реализацию.

Как я упоминал в других моих комментариях, надежная обработка PID-файлов является сложной задачей. Это склонно к гонкам и угловым случаям. Это становится сложнее, если есть какой-либо шанс, что ваш файл PID окажется в NFS или другой сетевой файловой системе (некоторая атомарность гарантирует, что вы получите с семантикой обработки файлов в надлежащих локальных файловых системах UNIX / Linux, которые исчезнут в некоторых версиях и реализациях NFS, например). Также семантика вокруг блокировки файлов в UNIX может быть сложной. (Быстро ли снимается блокировка flock или fcntl блокировка в вашей целевой ОС, например, когда процесс, удерживающий ее, уничтожается с помощью SIGKILL?).

Вы также можете использовать мониторинг Monit Or Process с помощью ps-watcher.

Вот пример для вашего сценария:

Моим решением этого было изменить

это означает, что полная работа crontab будет такой:

В моем случае, как быстрое исправление, я хотел, чтобы моя программа работала, когда она выходила с ошибкой en или она была убита. С другой стороны, я хотел остановить выполнение, когда программа завершилась правильно (код возврата = 0)

Я проверил это на Bash. Он должен нормально работать в любой другой оболочке

Источник

Общеобразовательный справочник
Adblock
detector