Да. Это, вероятно, то, что вы хотите
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 &");
Обратите внимание на «&», которое указывает оболочке отправлять новый процесс в фоновый режим.