Перезапуск самообновляющегося скрипта Python

При компиляции шаблоны должны быть созданы экземплярами , прежде чем их компилировать в объектный код. Это создание может быть достигнуто только в том случае, если известны аргументы шаблона. Теперь представьте сценарий, в котором функция шаблона объявлена ​​в a.h, определенная в a.cpp и используемая в b.cpp. Когда компилируется a.cpp, не обязательно известно, что для предстоящей компиляции b.cpp потребуется экземпляр шаблона, не говоря уже о том, какой конкретный экземпляр это будет.

Можно утверждать, что компиляторы можно сделать умнее, чтобы «смотреть вперед» для всех применений шаблона, но я уверен, что это было бы нелегко создавать рекурсивные или другие сложные сценарии. AFAIK, компиляторы этого не делают. Как заметил Антон, некоторые компиляторы поддерживают явные декларации экспорта экземпляров шаблонов, но не все компиляторы поддерживают его (пока?).

36
задан Ashy 17 November 2009 в 18:16
поделиться

5 ответов

В Linux или любой другой форме unix, os.execl и его друзья - хороший выбор для этого - вам просто нужно повторно выполнить exec sys .executable с теми же параметрами, с которыми он был запущен в последний раз ( sys.argv , более или менее) или любой его вариант, если вам нужно сообщить вашей следующей инкарнации, что это действительно перезапуск. В Windows os.spawnl (и друзья) - лучшее, что вы можете сделать (хотя временно это займет больше времени и памяти, чем os.execl и его друзья во время перехода).

27
ответ дан 27 November 2019 в 06:06
поделиться

Я думаю, что лучший Решение может быть примерно таким:

Ваша обычная программа:

...

# ... part that downloaded newest files and put it into the "newest" folder

from subprocess import Popen

Popen("/home/code/reloader.py", shell=True) # start reloader

exit("exit for updating all files")

Скрипт обновления: (например: home / code / reloader.py)

from shutil import copy2, rmtree
from sys import exit

# maybie you could do this automatic:
copy2("/home/code/newest/file1.py", "/home/code/") # copy file
copy2("/home/code/newest/file2.py", "/home/code/")
copy2("/home/code/newest/file3.py", "/home/code/")
...

rmtree('/home/code/newest') # will delete the folder itself

Popen("/home/code/program.py", shell=True) # go back to your program

exit("exit to restart the true program")

Надеюсь, это поможет вам.

3
ответ дан 27 November 2019 в 06:06
поделиться

Самым чистым решением является отдельный скрипт обновления!

Запустите вашу программу внутри него, сообщите (при выходе), что доступна новая версия. Это позволяет вашей программе сохранить все свои данные, программе обновления применить обновление и запустить новую версию, которая затем загрузит сохраненные данные и продолжит работу. Для пользователя это может быть полностью прозрачно, поскольку он просто запускает оболочку обновления, которая запускает настоящую программу.

2
ответ дан 27 November 2019 в 06:06
поделиться

У команды pocoo есть очень хороший перезагрузчик для своего сервера разработки внутри werkzueg. Проверьте код здесь (он находится в нижней части файла).

1
ответ дан 27 November 2019 в 06:06
поделиться

Вы можете использовать reload (module) , чтобы перезагрузить модуль.

0
ответ дан 27 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: