这篇文章:
Python: Disabling relative import
表明可以通过以下方式禁用相对导入:
from __future__ import absolute_import
但是,此规则似乎无法扩展到Jupyter笔记本电脑。当我创建一个与python包(在本例中为networkx)具有相同名称的python文件时,这是一个快速实验。这可能会导致该软件包的所有绝对导入失败。以下是描述这种情况的屏幕截图:
已安装的软件包“网络”已经包含子模块“绘图”,但是导入失败,并显示以下消息:
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-2-e38c4f8fc4a0> in <module>
1 from __future__ import absolute_import
2
----> 3 from networkx import drawing
ImportError: cannot import name 'drawing'
如何在Jupyter笔记本电脑或Jupyter实验室中修复它?这是否意味着我无法避免相对导入?
更新:非常感谢您的回答,其中之一是建议我的PYTHONPATH(或sys.path)已损坏,情况并非如此,我添加了以下行显示PYTHONPATH和已解决的模块路径不一致:
from __future__ import absolute_import
import os
import sys
for p in sys.path:
print(p)
print("=================")
import networkx
print(os.path.abspath(networkx.__file__))
from networkx import drawing
结果:
> /home/shared/anaconda3/lib/python36.zip
> /home/shared/anaconda3/lib/python3.6
> /home/shared/anaconda3/lib/python3.6/lib-dynload
> /home/peng/.local/lib/python3.6/site-packages
> /home/shared/anaconda3/lib/python3.6/site-packages
> /home/shared/anaconda3/lib/python3.6/site-packages/IPython/extensions
> /home/peng/.ipython
> ================= /home/peng/git/convnet-abstraction/slide/package/networkx.py
> --------------------------------------------------------------------------- ImportError Traceback (most recent call
> last) <ipython-input-4-d28ac292787c> in <module>
> 12 print(os.path.abspath(networkx.__file__))
> 13
> ---> 14 from networkx import drawing
>
> ImportError: cannot import name 'drawing'
这是另一个屏幕截图:
答案 0 :(得分:2)
相对进口在这里不相关。发生的情况是sys.path
可能看起来像这样:
[
'', # the current directory
'C:\\Program Files\\Python 3.5\\python35.zip',
'C:\\Program Files\\Python 3.5\\DLLs',
'C:\\Program Files\\Python 3.5\\lib',
'C:\\Program Files\\Python 3.5',
#network x is in one of these two
'C:\\Users\\<you>\\AppData\\Roaming\\Python\\Python35\\site-packages',
'C:\\Program Files\\Python 3.5\\lib\\site-packages'
]
当您键入import networkx
时,它将依次遍历每个目录,以查找networkx.py
之一。它会首先在“无标题的文件夹”中找到一个。
解决此问题的最佳方法是重命名文件或将其放在子目录mystuff/networkx
这不是一个好主意,但是您也可以执行sys.path.remove('')
删除第一条条目。