【问题标题】:imp.reload - NoneType object has no attribute 'name'imp.reload - NoneType 对象没有属性“名称”
【发布时间】:2015-02-01 01:35:35
【问题描述】:

以下代码:

def _IMPORT_(path)
    path = abspath(path)
    namespace = path[len(getcwd())+1:].replace('/', '_').strip('\\/;,. ')
    print(path)
    print(namespace)
    loader = importlib.machinery.SourceFileLoader(namespace, path+'.py')
    handle = loader.load_module(namespace)
    print(handle)
    importlib.reload(handle)
    return handle

生产:

/home/torxed/git/test/unitest/unix
unitest_unix
<module 'unitest_unix' from '/home/torxed/git/test/unitest/unix.py'>

Traceback (most recent call last):
  File "network.py", line 17, in <module>
    handle = sock()
  File "network.py", line 9, in __init__
    sock = _IMPORT_('./unix')
  File "/home/torxed/git/test/unitest/helpers.py", line 13, in _IMPORT_
    imp.reload(handle)
  File "/usr/lib/python3.4/imp.py", line 315, in reload
    return importlib.reload(module)
  File "/usr/lib/python3.4/importlib/__init__.py", line 149, in reload
    methods.exec(module)
  File "<frozen importlib._bootstrap>", line 1134, in exec
AttributeError: 'NoneType' object has no attribute 'name'

这在引入此类操作的 Python 3.3.5 中完美运行(在此之前有一些类似的导入机制)。但是在 Python 3.4.2 上,这显然不起作用。

自 3.3.5 以来发生了什么变化?找不到它的任何痕迹,或者更改位于版本中间的某个位置。去年有一个针对这种确切行为的补丁,其中没有传递环境变量,但似乎在这里工作。

【问题讨论】:

  • 奇怪的是,在我的 Python 3.4.2 (Mac OS X) 中它也不起作用,但我得到:AttributeError: 'module' object has no attribute 'machinery'

标签: python reload python-import python-3.4


【解决方案1】:

确实 importlib.reload 似乎只有在您位于正确目录时才有效。为了解决这个问题,我编写了一个可以调用的辅助函数:

def reload( module ):
  import os
  import os.path
  import importlib

  cwd = os.getcwd()
  os.chdir( os.path.dirname(os.path.abspath(module.__file__)) )
  importlib.reload( module )
  os.chdir( cwd )

【讨论】:

    【解决方案2】:

    我在切换文件夹后尝试重新加载文件时遇到同样的错误。

    例如:


    创建一个简单的模块:

    In [10]: %%file temp.py
        ...: message = "Hello World!"
        ...: 
    Writing temp.py
    

    加载模块并打印消息:

    In [14]: import temp
        ...: print(temp.message)
    Hello World!
    

    更改消息:

    In [17]: temp.message = 'Hello brave new world!'
        ...: print(temp.message)
    Hello brave new world!
    

    重新加载模块以取回原始消息:

    In [18]: import imp
        ...: imp.reload(temp)
        ...: print(temp.message)
    Hello World!
    

    到目前为止一切都很好......


    现在改变路径:

    In [20]: cd ..
    

    尝试重新加载模块:

    In [24]: imp.reload(temp)
    Traceback (most recent call last):
    
      File "<ipython-input-24-7fa95de0f250>", line 1, in <module>
    imp.reload(temp)
    
      File "/home/user/anaconda3/lib/python3.4/imp.py", line 315, in reload
    return importlib.reload(module)
    
      File "/home/user/anaconda3/lib/python3.4/importlib/__init__.py", line 149, in reload
    methods.exec(module)
    
      File "<frozen importlib._bootstrap>", line 1134, in exec
    
    AttributeError: 'NoneType' object has no attribute 'name'
    

    就我而言,解决方案是切换回最初进行导入的路径。

    【讨论】:

    • 非常感谢!我有同样的问题,找不到它。当我阅读您的答案时,我意识到我的脚本使用路径更改上下文管理器进行导入。我不知道重新加载不会保存导入路径!现在我必须使用与导入相同的上下文管理器,一切都很好。但是真的很烦,因为模块还是知道路径的……
    • 我使用 os.chdir 更改了目录,这对我来说是个问题,我改回原始目录并重新加载工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2021-11-02
    • 2014-07-05
    • 2018-05-05
    相关资源
    最近更新 更多