Может ли программа вызвать себя? - PullRequest
0 голосов
/ 23 октября 2010

У меня есть программа на Python, которая непрерывно запускает модель ячейки. когда я нажимаю «A» или «B», вызываются определенные функции - деление ячеек и т. д., когда нажата клавиша «esc», симуляция завершается. Есть ли способ для программы выйти и затем перезапустить себя, когда нажата «esc»?

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

Да. Это, вероятно, то, что вы хотите

The-Evil-MacBook:~ ivucica$ cat test.py
#!/usr/bin/env python
import sys
import os
print sys.argv[0] + " with argcount " + str(len(sys.argv))
if len(sys.argv) < 2 or sys.argv[1] != "2":
    print "doing recursion"
    os.system(sys.argv[0] + " 2");
else:
    print "not doing recursion"

exit(0)
The-Evil-MacBook:~ ivucica$ ./test.py
./test.py with argcount 1
doing recursion
./test.py with argcount 2
not doing recursion
The-Evil-MacBook:~ ivucica$ 

Поэтому, если вы хотите, чтобы программа перезапустила себя, просто вызовите ее sys.argv[0], используя os.system(), и немедленно вызовите exit(some_return_code_here) (ноль означает «без ошибок»). Возможно, вы захотите передать дополнительный аргумент, чтобы он знал, что это перезапущенный экземпляр, но это ни в коем случае не требуется; Я сделал это выше, чтобы предотвратить бесконечный цикл. Если у вас есть другие механизмы предотвращения бесконечных циклов, используйте их.

Обратите также внимание: для вышеприведенного кода вам необходимо запустить программу напрямую; python test.py не помогло мне (по понятным причинам). Кроме того, выше, вероятно, будет работать только в системах UNIX.

Также обратите внимание, что system() блокирует. Если вам нужно, чтобы исходная программа завершила работу при запуске новой программы, проще всего было бы отправить новую в фоновый режим (таким образом, «разблокировать» system()). Просто измените строку следующим образом:

    os.system(sys.argv[0] + " 2 &");

Обратите внимание на «&», которое указывает оболочке отправлять новый процесс в фоновый режим.

0 голосов
/ 23 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...