从内部重启python-script

dei*_*aur 29 python

我有一个基于python的GTK应用程序,可以加载几个模块.它是从(linux)终端运行的,如下所示:

./myscript.py --some-flag setting

用户可以从程序中下载(使用Git)较新的版本.如果存在/下载,则会出现一个按钮,我希望用新编译的内容(包括依赖项/导入)重新启动程序.优选地,它还将使用内容sys.argv来重新启动它以保持所有标志不变.

所以我找不到/需要的是一个很好的重启过程,杀死程序的当前实例并使用相同的参数启动一个新的.

优选地,该解决方案也适用于Windows和Mac,但它不是必需的.

Ign*_*ams 35

你在找os.exec*().

  • 这给了我一个无效的语法错误python 2.7.9. (2认同)
  • @clankill3r 命令中的星号是通配符,不应按字面意思理解。这是因为有无数以“exec”开头的命令,您必须为您的用例选择正确的命令。请参阅链接。但这个评论中的一些例子确实会有帮助。 (2认同)
  • 发生异常“PermissionError: [Errno 13] Permission returned”,有什么解决方案吗? (2认同)
  • 很棒的替代方法是使用:`os.execv(sys.executable, ['python'] + sys.argv)`。这样,您不需要使用“chmod”(看不到权限被拒绝错误),也不需要在脚本开头添加 shebang(看不到“OSError: [Errno 8] Exec format error”)。 (2认同)

小智 24

我认为这是一个更详细的答案,因为有时您可能会得到太多的打开文件对象和描述符,这可能导致内存问题或并发连接到网络设备.

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)
Run Code Online (Sandbox Code Playgroud)

  • 我不确定API是否已更改,但是对于当前psutil包(5.4.8),它是p.open_files()而不是p.get_open_files()。 (4认同)
  • 如果您使用 python 3.6 或更高版本,请将 `except Exception, e:` 更改为 `except Exception as e:` (4认同)
  • 我得到:错误:根:[Errno 9] 错误的文件描述符 (2认同)

Stu*_*ffe 8

我知道这个解决方案从技术上讲并不是您所要求的,但如果您想 100% 确定您释放了所有内容或者不想依赖依赖项,您可以从另一个循环中运行脚本:

import os, time

while 1:
    os.system("python main.py")
    print "Restarting..."
    time.sleep(0.2) # 200ms to CTR+C twice
Run Code Online (Sandbox Code Playgroud)

然后你可以重新启动 main.py,如下所示:

quit()
Run Code Online (Sandbox Code Playgroud)


Kam*_*ola 5

对我来说,这部分就像一个魅力:

def restart():
    import sys
    print("argv was",sys.argv)
    print("sys.executable was", sys.executable)
    print("restart now")

    import os
    os.execv(sys.executable, ['python'] + sys.argv)
Run Code Online (Sandbox Code Playgroud)

我在这里得到的。