如何从应用程序本身重新启动 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.run 是 new 首选方式?.. 【参考方案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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何在应用程序在侦听模式下具有 TCP 端口时即时重新启动应用程序?
如何使用 ctypes 停止和重新启动从 python 运行的 C++ 代码