我想从另一个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时导入了几个模块的问题
答案 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节
这可能对您有用,因为它似乎取代了原始流程?