首页 > 解决方案 > "from __future__ import absolute_import" 不会禁用 Jupyter 笔记本中的相对导入。如何解决?

问题描述

从这篇文章:

Python:禁用相对导入

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

from __future__ import absolute_import

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

在此处输入图像描述

安装的包 'network' 已经包含子模块 'drawing',但导入失败并显示以下消息:

---------------------------------------------------------------------------
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 notebook 或 Jupyter lab 中修复它?这是否意味着我无法避免相对导入?

更新:非常感谢您的回答,其中一个是建议我有一个损坏的 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'

这是另一个屏幕截图:

在此处输入图像描述

标签: pythonpython-3.xjupyter-notebookjupyterjupyter-lab

解决方案


相对导入在这里不相关。发生的事情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('')删除第一个条目。


推荐阅读