我有一个长期运行的Python服务器,并希望能够在不重新启动服务器的情况下升级服务.这样做的最佳方法是什么?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
Run Code Online (Sandbox Code Playgroud) TL/DR:
import gc, sys
print len(gc.get_objects()) # 4073 objects in memory
# Attempt to unload the module
import httplib
del sys.modules["httplib"]
httplib = None
gc.collect()
print len(gc.get_objects()) # 6745 objects in memory
Run Code Online (Sandbox Code Playgroud)
更新 我已经与Python开发人员联系了这个问题,事实上,"未来五年" 无法完全卸载模块.(见链接)
请接受Python确实不支持在2.x中卸载严重,基本,不可克服的技术问题的模块.
在我最近在我的应用程序中搜索memleak期间,我将其缩小到模块,即我无法收集卸载的模块.使用下面列出的任何方法卸载模块会在内存中留下数千个对象.换句话说 - 我无法在Python中卸载模块...
剩下的问题是尝试以某种方式垃圾收集模块.
我们试试吧:
import gc
import sys
sm = sys.modules.copy() # httplib, which we'll try to unload isn't yet
# in sys.modules, so, this isn't the source of problem
print len(gc.get_objects()) # 4074 objects in …Run Code Online (Sandbox Code Playgroud) 对我来说很明显,Python 2中没有干净的解决方案来卸载模块,这是一个已知的错误,已被纠正。
帖子:
如何卸载(重新加载)Python模块? 删除导入的python模块
2009年和2010年的报告证实了缺少对模块卸载的支持。
我想知道这是否在Python 3.x中得到了解决。当我这样做,import os,del os,dir(),该os模块是不存在(至少不可见,可用)。没了吗