Перезапустите программу Python
Я пишу программу Python, которая, если пользователь изменяет настройки во время ее запуска, должна быть перезапущена, чтобы применить измененные настройки. Есть ли способ сделать это? Я думаю что-то вроде:
import sys
command_line = ' '.join(sys.argv)
# Now do something with command_line
# Now call my custom exit procedure
Примечание: я на Windows, если это имеет значение
2 ответов
Я бы обошел все страхи, которые вы, вероятно, получите от попытки повторно запустить себя и оставить его в руках окружающей среды.
под этим я подразумеваю:
есть управляющая программа, которая не делает ничего, кроме запуска вашей программы (с теми же параметрами, что и было дано) в цикле, в то время как ваша программа выходит с определенным кодом "перезапуска". Это может быть так же просто, как
cmd
file или как сложная, как другая (очень простая) программа Python, которая используетos.system
). В принципе, пока управляющая программа получает код "перезагрузка", она будет повторно запускать вашу программу с точно такими же параметрами. Любой другой код заставит его выйти с этим кодом.когда вы хотите выйти полностью, выйдите из своей реальной программы Python с кодом возврата 0 (или что-нибудь, что не является кодом "перезапуска" в ситуации ошибки).
если вы просто хотите перейти на другую итерацию вашей программы (для повторного чтения config, например), выход с кодом" restart", распознанным управляющей программой.
но вы также можете подумать о перепроектировании своего приложения, чтобы оно могло перечитывать свою конфигурацию в любое время. Это заставит проблему исчезнуть. Вы не упоминаете, почему это не вариант, поэтому я предполагаю, что у вас есть причина, почему это не сработает.
но, если вы этого не сделаете, это путь, который я бы выбрал.
обеспечить некоторый образец код для первого варианта (это в Windows, но под Cygwin - те же основные правила должны применяться для Windows native Python, но вы должны проверить возвращаемые значения из os.system
).:
> cat phase1.py
#!/usr/bin/python
import os
status = 9
while status == 9:
status = int(os.system ("./phase2.py") / 256) # exit code is upper 8 bits
print "Controller: %d"%(status)
> cat phase2.py
#!/usr/bin/python
import sys
import time
time.sleep(1)
val = int(time.time())%10
if val == 0:
rc = 0
else:
rc = 9
print "Program: %d -> %d"%(val,rc)
sys.exit(rc)
> ./phase1.py
Program: 2 -> 9
Controller: 9
Program: 3 -> 9
Controller: 9
Program: 4 -> 9
Controller: 9
Program: 5 -> 9
Controller: 9
Program: 7 -> 9
Controller: 9
Program: 8 -> 9
Controller: 9
Program: 9 -> 9
Controller: 9
Program: 0 -> 0
Controller: 0
вы можете видеть, контроллер, используя код выхода 9, чтобы решить, следует ли повторно запустить программу. Сама программа является тупой, которая возвращает 9, если она не находится на 10-секундном множестве.
в unix вы можете использовать os.execl семейство функций:
все эти функции выполняют новую программу, заменяя текущий процесс; они не возвращаются. На Unix, новый исполняемый файл загружается в текущий процесс, и будет иметь тот же идентификатор процесса в качестве абонента. Ошибки будут сообщаться как исключения OSError.
в windows, взгляните на os.spawnl семейство, которое менее эффективно, чем unix звонки.