程序可以自我调用吗?

0 投票
2 回答
2105 浏览
提问于 2025-04-16 05:57

我有一个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 &");

注意 "&",它告诉系统把新进程放到后台。

撰写回答