如何从应用程序内部重新启动python应用程序

时间:2019-08-04 14:51:48

标签: python django subprocess supervisord

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

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

理想情况是希望从Django应用本身调用 systemctl restart administratord.service

所以我尝试了

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

但是,此操作失败并显示以下错误:

  

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

SO上有this question,但这是一个比较老的问题,答案依赖于操作系统。* ,而截至发帖时,子流程似乎成为访问操作系统功能的首选方式

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

更清洁的方式来启动自己的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)