"from __future__ import absolute_import" 不会在 Jupyter notebook 中禁用相对导入。如何解决?

"from __future__ import absolute_import" doesn't disable relative import in Jupyter notebook. How to fix it?

从这个post:

Python: Disabling relative import

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

from __future__ import absolute_import

然而这个规则似乎不能扩展到 Jupyter notebook。这是一个快速实验,当我创建一个与 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 中修复它?这是否意味着我无法避免相对导入?

UPDATE:非常感谢您的回答,其中之一是暗示我有一个损坏的 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'

这是另一个截图:

相对进口在这里不相关。发生的事情是 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。它首先在您的 "Untitled folder" 中找到那个。

解决此问题的最佳方法是重命名文件,或将其放在子目录中,mystuff/networkx

这不是个好主意,但您也可以 sys.path.remove('') 删除第一个条目。