【问题标题】:How to make a script automatically restart itself?如何让脚本自动重启?
【发布时间】:2016-03-15 17:42:13
【问题描述】:

如何让python程序自动重启?假设有一个非常简单的程序,例如:

var = input("Hi! I like cheese! Do you like cheese?").lower()
if var == "yes":
    print("That's awesome!")

现在,在 Python Shell 中,您必须按下 Run 按钮,然后按下“运行模块 (F5)”,或者只需按下键盘上的 F5 键.那是你第一次运行它。当程序结束时,您将返回到您的Cheese.py 文件,然后按 F5 再次运行程序。

每个人都和我在一起吗? 好的,所以我的问题是,如何让程序自动重启而无需您手动执行?

【问题讨论】:

  • 你的意思是你只是想循环程序,或者重新加载它,或者......什么?您要解决的实际问题是什么。
  • 将@jonrsharpe 的评论放入代码中:while True: main() 呢?假设 main() 是您正在调用的函数。
  • stackoverflow.com/a/33334183/1340631 有一个很好的解决方案。

标签: python


【解决方案1】:

这取决于您所说的“重新启动自身”是什么意思。如果你只是想连续执行相同的代码,你可以将它包装在一个函数中,然后在while True循环中调用它,例如:

>>> def like_cheese():
...     var = input("Hi! I like cheese! Do you like cheese?").lower()  # Corrected the call to `.lower`.
...     if var == "yes":
...         print("That's awesome!")
...
>>> while True:
...     like_cheese()
...
Hi! I like cheese! Do you like cheese?yes
That's awesome!
Hi! I like cheese! Do you like cheese?yes
That's awesome!

如果您想实际上重新启动脚本,您可以再次执行该脚本,通过执行以下操作将当前进程替换为新进程:

#! /bin/env python3
import os
import sys

def like_cheese():
    var = input("Hi! I like cheese! Do you like cheese?").lower()
    if var == "yes":
        print("That's awesome!")

if __name__ == '__main__':
    like_cheese()
    os.execv(__file__, sys.argv)  # Run a new iteration of the current script, providing any command line args from the current iteration.

这将不断地重新运行脚本,提供从当前版本到新版本的命令行参数。关于这个方法的更详细的讨论可以在Petr Zemek的帖子“Restarting a Python Script Within Itself”中找到。

this article 注释的一项是:

如果您使用上述解决方案,请记住exec*() 函数导致当前进程立即被替换, without flushing opened file objects。因此,如果您有任何 在重新启动脚本时打开的文件,你应该刷新 他们在调用exec*() 之前使用f.flush()os.fsync(fd) 功能。

【讨论】:

  • @shaikmoeed - 不确定,不是我确定我想执行的用例。如果源文件已更改,可能会在循环中插入哈希函数以重新启动。如果我正在监视配置文件中的更改,我将更有可能执行该用例。
【解决方案2】:

您可以只使用像 test.sh 这样的 shell 脚本,并确保在您的 linux 终端中使用 chmod +x test.sh

至于代码:

#!/bin/bash

while :
do
  sleep 5
  gnome-terminal --wait -- sh -c "python3 myscript.py 'myarg1'"
done

【讨论】:

    【解决方案3】:

    或者你可以试试

    $ chmod a+x "name".py
    

    然后,您可以通过

    运行脚本
    $ ./daemon.py
    

    在这种情况下,要重新启动脚本,请使用以下代码:

    os.execv(__file__, sys.argv)
    

    否则,当你通过

    运行脚本时
    $ python daemon.py
    

    使用此代码:

    os.execv(sys.executable, ['python'] + sys.argv)
    

    不管怎样,别忘了导入sys module

    【讨论】:

      【解决方案4】:

      您可以在while True: 中包装一些内容以使其重复执行,因为True 将始终评估为True,如下所示:

      while True:
          var = input("Hi! I like cheese! Do you like cheese?").lower() # <-- You had missed parentheses here        
          if var == "yes":
              print("That's awesome!")
      

      您的代码还有另一个问题;你还没有在lower 后面加上括号来调用它。

      【讨论】:

      • 这到底如何让程序自行重启
      • @redFIVE 它会反复运行,而他不必一次又一次地按 F5 来测试它的多个输入。我就是这样解释这个问题的。
      • 不知道为什么投反对票,这个答案解决了糟糕的书面问题。无论如何都可以通过谷歌搜索来回答。
      • 也许 OP 应该使用正确的命名法
      • 我同意对这个答案投反对票是不值得的。
      【解决方案5】:

      我使用 Mac 上的终端使用以下函数重新启动我的一些 python 脚本。

      import subprocess  
      def run_again(cmd):
          subprocess.call(["bash", "-c", "source ~/.profile; " + cmd])  
      

      注意:不要忘记“profile;”后面的空格字符否则函数可能会静默失败!

      然后在我的脚本底部重新启动:

      if some_condition:  
          run_again("python my_script.py %s" % my_new_arguments)  
      

      关于奶酪脚本的原始问题:

      if var != 'yes':  
          run_again("python my_cheese_script.py")  
      

      【讨论】:

        猜你喜欢
        • 2022-06-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 2013-09-11
        • 2019-03-13
        • 2014-04-13
        • 2011-02-12
        相关资源
        最近更新 更多