“从__future__导入absolute_import”不会在Jupyter笔记本中禁用相对导入。如何解决?

时间:2019-01-19 22:13:32

标签: python python-3.x jupyter-notebook jupyter jupyter-lab

这篇文章:

Python: Disabling relative import

表明可以通过以下方式禁用相对导入:

from __future__ import absolute_import

但是,此规则似乎无法扩展到Jupyter笔记本电脑。当我创建一个与python包(在本例中为networkx)具有相同名称的python文件时,这是一个快速实验。这可能会导致该软件包的所有绝对导入失败。以下是描述这种情况的屏幕截图:

enter image description here

已安装的软件包“网络”已经包含子模块“绘图”,但是导入失败,并显示以下消息:

---------------------------------------------------------------------------
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'

这是另一个屏幕截图:

enter image description here

1 个答案:

答案 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('')删除第一条条目。