Python,启动.py程序并终止以前的程序

时间:2017-04-06 21:05:17

标签: python exit termination

我想从另一个python程序启动一个python程序并同时退出以前的程序。

我在这里做了什么:

Starting

    Directory: C:\Modules\Global\Azure\Compute
Mode                LastWriteTime         Length Name                                                                   
----                -------------         ------ ----                                                                   
------        1/11/2016   1:59 PM         152824 Microsoft.ApplicationInsights.dll                                      
1
Starting

    Directory: C:\Modules\Global\Azure\Compute
Mode                LastWriteTime         Length Name                                                                   
----                -------------         ------ ----                                                                   
------        1/11/2016   1:59 PM         152824 Microsoft.ApplicationInsights.dll                                      
1
Starting

    Directory: C:\Modules\Global\Azure\Compute
Mode                LastWriteTime         Length Name                                                                   
----                -------------         ------ ----                                                                   
------        1/11/2016   1:59 PM         152824 Microsoft.ApplicationInsights.dll                                      
1

结果很明显,该程序启动了程序_to_launch.py​​'并等到它完成运行。

问题出在while循环中,刚刚启动的程序内部。 它可以无限期地使用。

这是问题所在;以前的程序仍在等待新程序的结束,它不会执行`sys.exit()

我可以使用`

杀死第一个程序

注意:

method provided by this answer之后,我无法导入程序以启动,因为我想终止第一个程序

if(self.start_button.pression==1):
        os.system('python program_to_launch.py')
        sys.exit()

所以我认为它不是一个解决方案。 命令import program_to_launch

exec file()

如链接答案中所建议的那样,它在执行program_to_launch.py​​时导入了几个模块的问题

3 个答案:

答案 0 :(得分:1)

可以说我要运行以下文件(名为maintenance.py),执行完后立即结束应用程序:

import wx

myApp = wx.App()
dial = wx.MessageDialog(None, f"This program is temporarily down for maintenance.\nWe will do our best to get it running again.\nThank you for your patience.", "Error", wx.OK|wx.ICON_ERROR)
dial.ShowModal()

使用子流程模块

这将是首选方法。只需使用Popen命令调用它即可。

import sys
import subprocess
subprocess.Popen(["py", "maintenance.py"])
sys.exit()

有关更多信息,请参见:https://docs.python.org/3.6/library/subprocess.html#popen-constructor

使用快捷方式

如果子进程不适合您,则可以创建一个快捷方式并使用os.startfile启动该快捷方式。例如,名为myShortcut.lnk的快捷方式具有以下目标:C:\Windows\py.exe C:\Users\kblad\Desktop\maintenance.py将适用于以下代码:

import os
import sys
os.startfile("myShortcut")
sys.exit()

有关更多信息,请参见:https://docs.python.org/3.6/library/os.html#os.startfile

答案 1 :(得分:0)

我认为您可以在新的线程或进程中启动该程序:

from os import system
from threading import Thread
from sys import exit

if self.start_button.pression == 1:
    thread = Thread()
    thread.run = lambda: system('python program_to_launch.py')
    thread.start()

    exit()

答案 2 :(得分:0)

我一直在寻找一种方法来重新加载我自己的python脚本,我发现了这篇文章:https://blog.petrzemek.net/2014/03/23/restarting-a-python-script-within-itself/

我不太明白[' python']的来源,但在阅读了OS.exec *的python文档之后,我发现了这个:

  

这些参数中的第一个作为自己的名称传递给新程序,而不是作为用户在命令行上键入的参数。对于C程序员来说,这是传递给程序main()的argv [0]。例如,os.execv(' / bin / echo',[' foo',' bar'])只会在标准输出上打印条形图; foo似乎会被忽略。

https://docs.python.org/2/library/os.html 第15.1.5节

这可能对您有用,因为它似乎取代了原始流程?