Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,启动一个.py程序并终止上一个程序_Python_Exit_Termination - Fatal编程技术网

Python,启动一个.py程序并终止上一个程序

Python,启动一个.py程序并终止上一个程序,python,exit,termination,Python,Exit,Termination,我想从另一个python程序启动一个python程序,同时退出上一个程序 以下是我所做的: if(self.start_button.pression==1): os.system('python program_to_launch.py') sys.exit() 结果很明显,程序启动“program_to_launch.py”并等待它完成运行 问题在于刚刚启动的程序中的while循环。 这是为了持续一段不确定的时间 问题就在这里;上一个程序仍在等待新程序的结束

我想从另一个python程序启动一个python程序,同时退出上一个程序

以下是我所做的:

if(self.start_button.pression==1):
        os.system('python program_to_launch.py')
        sys.exit()
结果很明显,程序启动“program_to_launch.py”并等待它完成运行

问题在于刚刚启动的程序中的while循环。 这是为了持续一段不确定的时间

问题就在这里;上一个程序仍在等待新程序的结束,它将不会执行'sys.exit()

我可以使用`

注:

之后,我无法导入要启动的程序,因为我要终止第一个程序

import program_to_launch 
所以我认为这不是一个解决办法。 以及命令
exec file()

execfile('program\u to\u launch.py')


正如链接答案中所建议的那样,在执行程序_to _launch.py的过程中导入几个模块会出现问题。我认为您可以在新线程或进程中启动程序:

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()

我正在寻找一种重新加载自己的python脚本的方法,我偶然发现了这篇文章:

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

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

第15.1.5节


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

假设我有以下文件(名为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()
有关详细信息,请参阅:

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

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

有关更多信息,请参见:

不幸的是,上一个程序仍然处于打开和冻结状态,我使用函数
print('bookmark')
查看程序在执行过程中到达的位置,它在
exit()函数之前到达。至少当我关闭第二个程序时,第一个程序也会关闭它。请尝试subprocess.Popen而不是os.system。即使没有线程
p2=subprocess.Popen(“/Users/johndoe/Desktop/PythonEXp/program_to_launch.py”)
它也应该可以工作。通过这种方式,我发现了很多问题,首先我必须指定路径(这本身不是问题,但代码变得不那么动态),其次它给了我一些关于授权的问题
OSError:[Errno 13]权限被拒绝
注意,我也尝试过
p2=subprocess.Popen(“program_to_launch.py-p”)
但是它没有找到programPopen('C:/Python36-32/python.exe“D:/Making/python/random scripts/conways\u game\u short\u glider.py'))这对我来说是有效的。我使用了绝对路径。关于这一点,已经有问题了:谢谢。这解决了很多问题。我不知道列表语法是用来做什么的,但我只是使用了subprocess.Popen(path),它工作得很好。你可以提供一个在cmd窗口中键入内容的列表或一个字符串。上面答案中的链接文档对其进行了更详细的解释。但最后,只要使用对你更有意义的东西就行了。:)