gpt4 book ai didi

python - 在 Python 3 上是否有任何库可以重新启动脚本?

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:51 24 4
gpt4 key购买 nike

我有一些 Python 脚本,可以完成一些工作。我想自动重新运行这个脚本。另外,我想在任何崩溃/卡住时重新启动它。我可以这样做:

while True:
try:
main()
except Exception:
os.execv(sys.executable, ['python'] + sys.argv)

但是,由于未知原因,这几天仍然崩溃或卡住一次。所以我看到崩溃,在 cmd 中写入“Python main.py”并启动,所以我不知道为什么 os.execv 不自己完成这项工作。我想这是因为这段代码是这个应用程序的一部分。所以,我更喜欢一些脚本/应用程序,它将以外部方式控制重新启动。我希望它会更稳定。

所以这个脚本应该以这种方式工作:

  1. 启动任何脚本
  2. 检查此脚本的进程是否正常工作,例如检查一些文件时间更改并通过进程名称|ID|等进行控制。
  3. 当它从进程列表中消失时,再次启动它
  4. 当文件在超过 5 分钟前更改时,停止进程,等待几秒钟,然后再次启动它。
  5. 总的来说:是跨平台的(Linux/Windows)
  6. 不重要记录所有崩溃。

我可以自己做这件事(现在正在努力),但我很确定这样的事情一定已经有人做过了,我只是在 Google\Github 中找不到它。

更新:添加了来自@hansaplast 对 GitHub 的回答的代码。还对其进行了一些更改:relauncher .请随意复制/使用它。

最佳答案

因为它需要同时在 Windows 和 Linux 上工作,我不知道如何使用标准工具来做到这一点,所以这里有一个 DIY 解决方案:

from subprocess import Popen
import os
import time

# change into scripts directory
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)

while True:
p = Popen(['python', 'my_script.py', 'arg1', 'arg2'])
time.sleep(20) # give the program some time to write into logfile
while True:
if p.poll() != None:
print('crashed or regularly terminated')
break
file_age_in_s = time.time() - os.path.getmtime('output.log')
if file_age_in_s > 60:
print('frozen, killing process')
p.kill()
break
time.sleep(1)

print('restarting..')

解释:

  • time.sleep(20):给脚本 20 秒时间写入日志文件
  • poll():定期检查脚本是否死亡(崩溃或定期终止,您可以检查 poll() 的返回值来区分)
  • getmtime():定期检查 output.log 并检查在过去 60 秒内是否发生了变化
  • time.sleep(1):在每次检查之间等待 1s,否则会占用太多系统资源

该脚本假定检查脚本和运行脚本位于同一目录中。如果不是这种情况,请更改“更改为脚本目录”下面的行

关于python - 在 Python 3 上是否有任何库可以重新启动脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48248014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com