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) 假设def my_function():位于my_apps.views中,我想动态导入"my_function"而不使用像exec或eval这样的东西.
无论如何要做到这一点.我想做类似的事情:
my_function = import_func("my_apps.views.my_function")
my_function()...代码被执行
我需要在运行时添加模块属性.例如,加载模块时,它会读取包含数据的文件.我希望这些数据可用作模块属性,但数据仅在运行时可用.
如何在运行时添加模块属性?
尝试globals()根据一些动态环境变量动态添加设置属性。
import os
from importlib import import_module
# To support environment variables as the means of specifying
# the target environment as an alternative to using the --settings flag
# where MY_ENV is 'local', 'development', 'staging', 'production'
if os.environ.get('MY_ENV'):
env = os.environ.get('MY_ENV')
import_module('my.settings.%s' % env, '*')
Run Code Online (Sandbox Code Playgroud)
它的理解是import_module需要分配给一个变量:
foo = import_module('path.to.package', 'bar')
Run Code Online (Sandbox Code Playgroud)
然后:
globals()[foo] = foo
Run Code Online (Sandbox Code Playgroud)
可以将其添加到global范围。
但是,使用通配符*怎么办?
globals()[*] = import_module('path.to.package', '*')
Run Code Online (Sandbox Code Playgroud)
显然,以上情况导致语法错误。
与__init__.py在目录中,我能够将其导入
from subdirectory.file import *
Run Code Online (Sandbox Code Playgroud)
但我希望导入该子目录中的每个文件;所以我试过了
from subdirectory.* import *
Run Code Online (Sandbox Code Playgroud)
这不起作用。有什么建议?