imp.重新加载NoneType对象没有属性“name”

2024-04-20 00:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码:

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

产生:

^{pr2}$

这在python3.3.5中非常适用,在python3.3.5中引入了此类操作(在此之前,有一些类似的导入机制)。但是在python3.4.2上,这显然行不通。在

3.3.5之后有什么变化?找不到它的任何痕迹,或者更改在发布过程中的某个地方。去年有一个修补程序,在这种情况下,环境变量没有传递,但在这里似乎起作用了。在


Tags: path代码importlendefloaderimportlibnamespace
2条回答

在切换文件夹后尝试重新加载文件时,也会出现相同的错误。在

例如:


创建一个简单的模块:

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

加载模块并打印消息:

^{2}$

更改消息:

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'

在我的例子中,解决方案是切换回最初进行导入的路径。在

确实如此importlib.reload导入似乎只有在正确的目录中才有效。为了解决这个问题,我编写了一个可以调用的helper函数:

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 )

相关问题 更多 >