如何从应用程序本身重新启动 python 应用程序

Posted

技术标签:

【中文标题】如何从应用程序本身重新启动 python 应用程序【英文标题】:How do I restart a python app from within the app itself 【发布时间】:2019-12-12 07:51:06 【问题描述】:

有一个 Django 应用程序让用户通过设置向导。完成向导后,应用需要重新启动才能选择必要的设置。

该应用在 Ubuntu 18.04 上运行并使用 supervisord 进行监控。

理想情况下,我希望从 Django 应用程序本身调用 systemctl restart supervisord.service

所以我试过了

import subprocess
subprocess.run("systemctl restart supervisord.service")

但是,这会失败并出现错误:

FileNotFoundError [Errno 2] 没有这样的文件或目录:'systemctl 重启 supervisord.service': 'systemctl restart supervisord.service'

这里有this question SO,但这是一个较老的问题,并且那里的答案依赖于 os.* 而在此发布时 subprocess 似乎是首选方式或访问操作系统功能

【问题讨论】:

Restart python-script from within itself的可能重复 其相关但最近的文本似乎表明 subprocess.runnew 首选方式?.. 【参考方案1】:

更简洁的方式来启动你自己的 python 程序是:-

import os
import sys
import psutil
import logging

def restart_program():
    """Restarts the current program, with file objects and descriptors
       cleanup
    """

    try:
        p = psutil.Process(os.getpid())
        for handler in p.get_open_files() + p.connections():
            os.close(handler.fd)
    except Exception, e:
        logging.error(e)

    python = sys.executable
    os.execl(python, python, *sys.argv)

【讨论】:

谢谢。会试一试。您介意解释一下为什么它比使用子流程更干净吗?【参考方案2】:

看到我的错误。该命令应运行为:

subprocess.run(["systemctl", "restart", "supervisor.service"])

来源:http://queirozf.com/entries/python-3-subprocess-examples

【讨论】:

以上是关于如何从应用程序本身重新启动 python 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

重新启动 Nginx 或在证书更改时重新加载证书缓存

Python - 如何在应用程序在侦听模式下具有 TCP 端口时即时重新启动应用程序?

如何在不重新启动树莓派本身的情况下重新启动 ALSA?

如何使用 ctypes 停止和重新启动从 python 运行的 C++ 代码

是否可以从服务本身以编程方式重新启动 Windows 服务?还是我应该选择其他方法? [复制]

如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?