"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('')
删除第一个条目。
从这个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('')
删除第一个条目。