При компиляции шаблоны должны быть созданы экземплярами , прежде чем их компилировать в объектный код. Это создание может быть достигнуто только в том случае, если известны аргументы шаблона. Теперь представьте сценарий, в котором функция шаблона объявлена в a.h
, определенная в a.cpp
и используемая в b.cpp
. Когда компилируется a.cpp
, не обязательно известно, что для предстоящей компиляции b.cpp
потребуется экземпляр шаблона, не говоря уже о том, какой конкретный экземпляр это будет.
Можно утверждать, что компиляторы можно сделать умнее, чтобы «смотреть вперед» для всех применений шаблона, но я уверен, что это было бы нелегко создавать рекурсивные или другие сложные сценарии. AFAIK, компиляторы этого не делают. Как заметил Антон, некоторые компиляторы поддерживают явные декларации экспорта экземпляров шаблонов, но не все компиляторы поддерживают его (пока?).
В Linux или любой другой форме unix, os.execl и его друзья - хороший выбор для этого - вам просто нужно повторно выполнить exec sys .executable с теми же параметрами, с которыми он был запущен в последний раз ( sys.argv
, более или менее) или любой его вариант, если вам нужно сообщить вашей следующей инкарнации, что это действительно перезапуск. В Windows os.spawnl (и друзья) - лучшее, что вы можете сделать (хотя временно это займет больше времени и памяти, чем os.execl и его друзья во время перехода).
Я думаю, что лучший Решение может быть примерно таким:
Ваша обычная программа:
...
# ... 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")
Надеюсь, это поможет вам.
Самым чистым решением является отдельный скрипт обновления!
Запустите вашу программу внутри него, сообщите (при выходе), что доступна новая версия. Это позволяет вашей программе сохранить все свои данные, программе обновления применить обновление и запустить новую версию, которая затем загрузит сохраненные данные и продолжит работу. Для пользователя это может быть полностью прозрачно, поскольку он просто запускает оболочку обновления, которая запускает настоящую программу.
У команды pocoo есть очень хороший перезагрузчик для своего сервера разработки внутри werkzueg. Проверьте код здесь (он находится в нижней части файла).
Вы можете использовать reload (module) , чтобы перезагрузить модуль.