程序可以调用自己吗?

时间:2010-10-23 08:25:56

标签: python linux command-line

我有一个连续运行单元模型的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$ 

因此,当您希望程序重新启动时,只需使用sys.argv[0]调用os.system()并立即调用exit(some_return_code_here)(零表示“无错误”)。您可能希望传递一个额外的参数,因此它知道它是一个重新启动的实例,但绝不需要这样做;我这样做是为了防止无限循环。如果你有其他机制来防止无限循环,那就使用它们。

请注意:对于上面的代码,您需要直接运行程序; python test.py没有为我做这个伎俩(原因很明显)。此外,上述内容可能仅适用于UNIX系统。

另请注意,system()正在阻止。如果您需要原始程序在启动新程序时完成关闭,最简单的方法是将新程序发送到后台(因此“解锁”system())。只需修改这样的行:

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

注意“&amp;”告诉shell将新进程发送到后台。

答案 1 :(得分:0)

显而易见的解决方案是让程序在退出之前启动它自身的新副本。但您可能应该更多地考虑编码模拟器,以便可以重置它而无需重新启动程序。