【问题标题】:Python, launch a .py program and terminate the previous programPython,启动一个 .py 程序并终止之前的程序
【发布时间】:2018-12-18 03:55:39
【问题描述】:

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

我做了什么:

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

结果很明显,程序启动'program_to_launch.py​​'并等待它完成运行。

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

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

我可以使用`杀死第一个程序

注意事项:

按照method provided by this answer,我无法导入要启动的程序,因为我想终止第一个程序

import program_to_launch 

所以我认为这不是一个解决方案。 和命令exec file()

execfile('program_to_launch.py')

正如链接答案中所建议的那样,在执行 program_to_launch.py​​ 时导入多个模块会出现问题

【问题讨论】:

    标签: python exit termination


    【解决方案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

    【讨论】:

    • 谢谢。这解决了很多问题。我不知道列表语法的用途,但我只是使用了 subprocess.Popen(path) 并且效果很好。
    • 您可以提供您将在 cmd 窗口中键入的内容的列表或仅提供一个字符串。上述答案中的链接文档更详细地解释了它。最后,只使用对您更有意义的东西。 :)
    【解决方案2】:

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

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

    【讨论】:

    • 不幸的是,之前的程序保持打开和冻结状态,我使用函数print('bookmark') 来查看程序在执行中到达的位置,它在exit() 函数之前到达。至少当我关闭第二个程序时,第一个程序也会关闭它。
    • 代替 os.system 尝试 subprocess.Popen。即使没有线程它也应该工作
    • p2 = subprocess.Popen("/Users/johndoe/Desktop /PythonEXp/program_to_launch.py") 这样我发现了很多问题,首先我必须指定路径(这本身不是问题,但是代码变得不那么动态了)其次它给了我一些问题关于授权。 OSError: [Errno 13] Permission denied
    • 注意,我也试过p2 = subprocess.Popen("program_to_launch.py -p"),但找不到程序
    • Popen('C:/Python36-32/python.exe "D:/Making/Python/random scripts/conways_game_short_glider.py"') 这对我有用。我使用了绝对路径。对此也有疑问:stackoverflow.com/q/21412610/7062162
    【解决方案3】:

    我正在寻找一种方法来重新加载我自己的 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']) 只会在标准输出上打印 bar; foo 似乎会被忽略。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2017-08-31
      • 1970-01-01
      • 2011-09-18
      • 2015-03-12
      • 2018-05-17
      相关资源
      最近更新 更多