Перезапустите программу Python

Я пишу программу Python, которая, если пользователь изменяет настройки во время ее запуска, должна быть перезапущена, чтобы применить измененные настройки. Есть ли способ сделать это? Я думаю что-то вроде:

import sys
command_line = ' '.join(sys.argv)
# Now do something with command_line
# Now call my custom exit procedure

Примечание: я на Windows, если это имеет значение

2 ответов


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

под этим я подразумеваю:

  1. есть управляющая программа, которая не делает ничего, кроме запуска вашей программы (с теми же параметрами, что и было дано) в цикле, в то время как ваша программа выходит с определенным кодом "перезапуска". Это может быть так же просто, как cmd file или как сложная, как другая (очень простая) программа Python, которая использует os.system). В принципе, пока управляющая программа получает код "перезагрузка", она будет повторно запускать вашу программу с точно такими же параметрами. Любой другой код заставит его выйти с этим кодом.

  2. когда вы хотите выйти полностью, выйдите из своей реальной программы Python с кодом возврата 0 (или что-нибудь, что не является кодом "перезапуска" в ситуации ошибки).

  3. если вы просто хотите перейти на другую итерацию вашей программы (для повторного чтения 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 звонки.