【发布时间】:2012-02-27 06:44:38
【问题描述】:
我正在尝试重新加载已在 sys.modules 中加载的模块,但不知何故,reload() 似乎不起作用。 (compile()+load 会起作用,但我仍然不能使用它,因为它是通过扭曲重新加载代码)
for loader, module_name, is_pkg in pkgutil.walk_packages(main_module.__path__):
if(not module_name in sys.modules):
module = loader.find_module(module_name).load_module(module_name)
else:
module = sys.modules.get(module_name)
#this is unhelpful
#sys.path.append(module.__path__)
#this works
#imp.find_module(module.__name__, module.__path__)
#this doesn't
reload(module)
Traceback (most recent call last):
File "/usr/lib64/python2.7/site-packages/celery/execute/trace.py", line 36, in trace
return cls(states.SUCCESS, retval=fun(*args, **kwargs))
File "/usr/lib64/python2.7/site-packages/celery/app/task/__init__.py", line 232, in __call__
return self.run(*args, **kwargs)
File "/usr/lib64/python2.7/site-packages/celery/app/__init__.py", line 172, in run
return fun(*args, **kwargs)
File "/home/myuser/Dropbox/job-pipe/job_pipe/apps/tasks/crawl.py", line 71, in crawl
crawler = CrawlerScript()
File "/home/myuser/Dropbox/job-pipe/job_pipe/apps/tasks/crawl.py", line 37, in __init__
reload(module)
ImportError: No module named example
重新加载的正确方法是什么?我还以为是find_module引起的,虽然貌似可以正常工作,报错也没用。
谢谢。
【问题讨论】:
-
你是如何导入模块的?
-
导入模块的代码在上面是用 module = loader.find_module(module_name).load_module(module_name) 导入的。在重新加载之前重新导入模块没有帮助,重新加载仍然崩溃
-
您应该发布完整的回溯,而不仅仅是异常。
-
另外,发布一个完整的程序,而不是一个sn-p。
-
看起来你在这里尝试做的是导入宇宙中的每个模块,或者在某个包中,然后重新执行任何已经导入的模块。许多模块不是重新加载安全的,这就是为什么rebuild具有向可能需要重新加载的模块添加特殊钩子的功能;它不能自动为您解决问题,它只是为您提供工具来自己解决问题。你在这里所做的是执行大量我们看不到的任意代码,因此很难推测问题的原因。