imp.reload - NoneType对象没有属性'name'

Tor*_*xed 11 python reload python-import python-3.4

以下代码:

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
Run Code Online (Sandbox Code Playgroud)

生产:

/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'
Run Code Online (Sandbox Code Playgroud)

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

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

ost*_*ach 8

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

例如:


创建一个简单的模块:

In [10]: %%file temp.py
    ...: message = "Hello World!"
    ...: 
Writing temp.py
Run Code Online (Sandbox Code Playgroud)

加载模块并打印消息:

In [14]: import temp
    ...: print(temp.message)
Hello World!
Run Code Online (Sandbox Code Playgroud)

更改消息:

In [17]: temp.message = 'Hello brave new world!'
    ...: print(temp.message)
Hello brave new world!
Run Code Online (Sandbox Code Playgroud)

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

In [18]: import imp
    ...: imp.reload(temp)
    ...: print(temp.message)
Hello World!
Run Code Online (Sandbox Code Playgroud)

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


现在改变路径:

In [20]: cd ..
Run Code Online (Sandbox Code Playgroud)

尝试重新加载模块:

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'
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢!我有同样的问题,找不到它。当我阅读您的答案时,我意识到我的脚本使用路径更改上下文管理器进行导入。我不知道重新加载不会保存导入路径!现在我必须使用与导入相同的上下文管理器,一切都很好。但是真的很烦,因为模块还是知道路径的…… (2认同)