我有一个长期运行的Python服务器,希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
我有一个长期运行的Python服务器,希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
当前回答
如果一个模块不是纯Python的,那么删除它会特别困难。
下面是来自:如何真正删除导入的模块?
您可以使用sys.getrefcount()来找出的实际数量 参考文献
>>> import sys, empty, os
>>> sys.getrefcount(sys)
9
>>> sys.getrefcount(os)
6
>>> sys.getrefcount(empty)
3
大于3的数字表示 它将很难摆脱 模块。本土的“空” (不包含任何内容)模块应该 垃圾收集后
>>> del sys.modules["empty"]
>>> del empty
因为第三个参考是一个人工制品 getrefcount()函数的。
其他回答
这是重新加载一个模块的现代方式:
from importlib import reload
如果你想支持3.5以上的Python版本,请使用以下命令:
from sys import version_info
if version_info[0] < 3:
pass # Python 2 has built in reload
elif version_info[0] == 3 and version_info[1] <= 4:
from imp import reload # Python 3.0 - 3.4
else:
from importlib import reload # Python 3.5+
这定义了一个重载方法,可以通过模块调用来重载它。例如,reload(math)将重载数学模块。
if 'myModule' in sys.modules:
del sys.modules["myModule"]
其他选项。请参阅Python默认importlib。Reload将只是重新导入作为参数传递的库。它不会重新加载库导入的库。如果您更改了很多文件,并且有一个有点复杂的包要导入,那么您必须进行深度重载。
如果你安装了IPython或Jupyter,你可以使用一个函数来深度重载所有库:
from IPython.lib.deepreload import reload as dreload
dreload(foo)
如果你没有Jupyter,在你的shell中使用以下命令安装它:
pip3 install jupyter
从sys. exe中移除模块。modules也需要删除'None'类型。
方法1:
import sys
import json ## your module
for mod in [ m for m in sys.modules if m.lstrip('_').startswith('json') or sys.modules[m] == None ]: del sys.modules[mod]
print( json.dumps( [1] ) ) ## test if functionality has been removed
方法2,使用簿记条目,删除所有依赖项:
import sys
before_import = [mod for mod in sys.modules]
import json ## your module
after_import = [mod for mod in sys.modules if mod not in before_import]
for mod in [m for m in sys.modules if m in after_import or sys.modules[m] == None]: del sys.modules[mod]
print( json.dumps( [2] ) ) ## test if functionality has been removed
可选的,只是为了确保所有的条目都出来了,如果你这样选择:
import gc
gc.collect()
如果一个模块不是纯Python的,那么删除它会特别困难。
下面是来自:如何真正删除导入的模块?
您可以使用sys.getrefcount()来找出的实际数量 参考文献
>>> import sys, empty, os
>>> sys.getrefcount(sys)
9
>>> sys.getrefcount(os)
6
>>> sys.getrefcount(empty)
3
大于3的数字表示 它将很难摆脱 模块。本土的“空” (不包含任何内容)模块应该 垃圾收集后
>>> del sys.modules["empty"]
>>> del empty
因为第三个参考是一个人工制品 getrefcount()函数的。