【问题标题】:Can a program call itself?程序可以调用自己吗?
【发布时间】:2010-10-23 08:25:56
【问题描述】:

我有一个连续运行单元模型的 Python 程序。当我按下“A”或“B”时,某些功能被调用 - 细胞分裂等。当按下“esc”键时,模拟退出。有没有办法让程序在按下“esc”时退出然后重新启动?

【问题讨论】:

    标签: python linux command-line


    【解决方案1】:

    是的。这可能就是你想要的

    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 &");
    

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

    【讨论】:

    • 您是否最终会导致原始(父)进程等待子进程结束,然后再自行结束?如果您多次重复此操作,那将不会那么好。
    • 是的,因为 system() 阻塞了。你说的对。尽管如此,询问者并没有准确说明这是否会进行多次。我认为最简单的方法是在 system() 的命令行末尾传递一个“&”可能会奏效,因为 shell 应该负责将新程序置于后台。不过,仅在 UNIXoid 系统下。
    • 也许(至少在 UNIXoid 系统上)你可以考虑 EXEC 没有这个问题。我不熟悉 Python,但在 Perl 中它同样易于使用。
    • 当然;可以在 C 中使用 fork() 和 exec()。我只是想以最简单的方式回答,而不是在 Python 中查找如何做到这一点。
    【解决方案2】:

    显而易见的解决方案是让程序启动一个新的自身副本,作为退出前的最后一件事。但是您可能应该更多地考虑对模拟器进行编码,以便在不需要完全重新启动程序的情况下重置它。

    【讨论】:

    • 但是如果我在后台调用程序,我的按键会传递给它吗?如果我正常调用它,最后一个模拟不会继续运行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多