【问题标题】:How to open another program upon exiting the program in Python?如何在 Python 中退出程序后打开另一个程序?
【发布时间】:2013-07-27 17:27:25
【问题描述】:

我有一个程序需要在退出后进行一些清理,并为此编写了一个单独的 .py 文件。但是,我使用的程序有一部分处于无限循环中:

pythoncom.PumpMessages()

因此,程序没有“自然”关闭。唯一的方法是从任务管理器中结束进程。

所以我问:有没有办法在从任务管理器结束后自动运行我的清理 python 脚本?

编辑:如果有帮助,我可以以不同的方式将其置于无限循环中,例如:

while True:
    pythoncom.PumpWaitingMessages()

【问题讨论】:

标签: python windows


【解决方案1】:

您可以从单独的 python 脚本运行这两个脚本,并在运行第二个进程之前终止第一个进程。

例如使用 subprocess.Popen:

 proc1 = subprocess.Popen(cmd, shell = True)
 time.sleep(waititme) #or other flag, such as reading another source
 proc1.kill() 
 proc2 = subprocess.Popen(cmd2, shell = True)

【讨论】:

    【解决方案2】:

    我的项目中有示例:

    import signal
    
    def term(*args,**kwargs):
        sys.stderr.write('\nStopping...')
        do_cleaning_stuff_here()
    
    signal.signal(signal.SIGTERM, term)
    signal.signal(signal.SIGINT, term)
    signal.signal(signal.SIGQUIT, term)
    yuor_main_code_here()
    

    无限循环:

    import signal
    
    def term(*args,**kwargs):
        global running
        sys.stderr.write('\nStopping...')
        running=False
    
    signal.signal(signal.SIGTERM, term)
    signal.signal(signal.SIGINT, term)
    signal.signal(signal.SIGQUIT, term)
    running=True
    while running:
        handle()
    cleanup()
    

    windows 信号转换为 unix 等价物。

    【讨论】:

      【解决方案3】:

      在 unix 中,当你杀死一个进程时,你会向它发送一个信号。例如,CTRL-C 会导致向程序发送一个信号。

      在 Windows 上,其中一些信号被模拟,包括 CTRL-C。如果您的循环没有调用阻止 CTRL-C 信号的函数,那么您可以按 CTRL-C 来终止循环。您可以尝试使用 CTRL-C 来终止您的程序,而不是通过任务管理器来完成吗?

      如果它以这种方式工作,您可以编写一个处理程序来捕获 CTRL-C 信号、清理程序状态和sys.exit()

      以下是捕获信号的代码: How do I capture SIGINT in Python?

      【讨论】:

      • CTRL-C 将 SIGINT 发送到 python 脚本
      • @eri,是的,并且有一个指向“如何在 Python 中捕获 SIGINT”的链接。
      猜你喜欢
      • 2019-01-01
      • 1970-01-01
      • 2023-01-12
      • 2019-12-10
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多