我有一个基于python的GTK应用程序,可以加载几个模块.它是从(linux)终端运行的,如下所示:
./myscript.py --some-flag setting
用户可以从程序中下载(使用Git)较新的版本.如果存在/下载,则会出现一个按钮,我希望用新编译的内容(包括依赖项/导入)重新启动程序.优选地,它还将使用内容sys.argv来重新启动它以保持所有标志不变.
所以我找不到/需要的是一个很好的重启过程,杀死程序的当前实例并使用相同的参数启动一个新的.
优选地,该解决方案也适用于Windows和Mac,但它不是必需的.
Ign*_*ams 35
你在找os.exec*().
小智 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)
我知道这个解决方案从技术上讲并不是您所要求的,但如果您想 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)
对我来说,这部分就像一个魅力:
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)
我在这里得到的。
| 归档时间: |
|
| 查看次数: |
58406 次 |
| 最近记录: |