2012-07-04 208 views
14

我有一个基于python的GTK应用程序加载了几个模块。它是从(Linux)的终端,像这样运行:从本身重新启动python脚本

./myscript.py --some-flag setting

从该程序的用户可以下载(使用GIT)的较新版本中。 如果存在/被下载,出现一个按钮,我希望用新编译的内容(包括依赖/导入)重新启动程序。最好它还会使用sys.argv的内容重新启动它,以保持所有标志原样。

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

该解决方案最好也适用于Windows和Mac,但它不是必需的。

+0

什么可能是可能是有在第一并行运行旧的一个新的进程。理论上你可以给新进程一个旧进程的ID(通过一个额外的命令行选项),并在新进程启动并运行时立即终止。 –

+0

[重新启动自我更新的Python脚本]的可能的重复(http://stackoverflow.com/questions/1750757/restarting-a-self-updating-python-script) –

回答

24

您正在查找os.exec*()

+0

哇!我不知道这是可能的。感谢您指出了这一点! –

+2

这给了我一个与Python 2.7.9无效的语法错误。 – clankill3r

2

更新 - 一些例如上面的回答备查

runme.sh

#!/bin/bash 
kill -9 server.py 
python /home/sun/workspace/c/src/server.py & 

,我有server.py,我需要重新启动应用程序本身,所以我不得不:

os.system('runme.sh') 

但是没有按照runme.sh重新启动应用程序本身,所以当我用这种方式时:

os.execl('runme.sh', '') 

然后我就能将其自身重启

14

我认为这是一个更复杂的答案,因为有时你可能最终与打开太多的文件对象和描述符,可能会导致内存问题或并发连接一个网络设备。

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) 
0

我知道这个解决方案在技术上没有你问什么,但如果你想成为100%肯定你释放所有或不想依靠的依赖,你可以只从运行脚本环路另:

import os, time 

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

然后你就可以重新启动main.py简单,如:

quit()