程序可以自我调用吗?
我有一个Python程序,它会不停地运行一个细胞模型。当我按下“A”或“B”键时,会调用一些特定的功能,比如细胞分裂等等。当我按下“esc”键时,模拟就会退出。请问有没有办法让程序在按下“esc”键后退出,然后再自己重新启动呢?
2 个回答
0
一个明显的解决办法就是在程序退出之前,最后做的事情就是启动一个新的自己。不过,你可能更应该考虑的是,编写一个模拟器,让它可以在不完全重启程序的情况下进行重置。
2
是的。这可能正是你想要的。
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$
当你想让程序自己重启时,只需用 os.system()
调用它的 sys.argv[0]
,然后立刻调用 exit(some_return_code_here)
(这里的零表示“没有错误”)。你可能想传递一个额外的参数,这样程序就知道这是一个重启的实例,但这并不是必须的;我上面这样做是为了防止无限循环。如果你有其他方法来防止无限循环,那就用那些方法。
另外请注意:对于上面的代码,你需要直接运行程序;用 python test.py
是不行的(原因很明显)。而且,上面的代码可能只在 UNIX 系统下有效。
还要注意的是,system()
是阻塞的。如果你希望原来的程序在启动新程序时完全关闭,最简单的方法就是把新程序放到后台运行(这样就“解锁”了 system()
)。只需把那行代码修改成这样:
os.system(sys.argv[0] + " 2 &");
注意 "&",它告诉系统把新进程放到后台。