以下代码:
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以来发生了什么变化?无法找到任何痕迹,或者更改位于版本中间的某个位置。去年有一个针对这种确切行为的补丁,其中环境变量没有传递下来,但似乎在这里工作。
答案 0 :(得分:6)
我在切换文件夹后尝试重新加载文件时遇到同样的错误。
例如:
创建一个简单的模块:
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'
就我而言,解决方案是切换回最初进行导入的路径。
答案 1 :(得分:0)
实际上,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 )