【问题标题】:python reload can't find module from sys.modulespython reload 无法从 sys.modules 中找到模块
【发布时间】: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具有向可能需要重新加载的模块添加特殊钩子的功能;它不能自动为您解决问题,它只是为您提供工具来自己解决问题。你在这里所做的是执行大量我们看不到的任意代码,因此很难推测问题的原因。

标签: python module reload


【解决方案1】:

一旦你加载了一个模块,你必须重新加载它

module = reload(module)

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2020-06-22
    • 2018-07-31
    • 2019-04-27
    相关资源
    最近更新 更多