python - "from __future__ import absolute_import" 不会禁用 Jupyter 笔记本中的相对导入。如何解决?
问题描述
从这篇文章:
表明可以通过以下方式禁用相对导入:
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'
这是另一个屏幕截图:
解决方案
相对导入在这里不相关。发生的事情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('')
删除第一个条目。
推荐阅读
- javascript - 如何仅获取反应表中的过滤数据?
- python-3.x - 如何在超过 3 个三行 python 的情况下获取连续时间的行
- javascript - ChartJS - this.setValue 不是函数
- c# - 从 FlowDocumentScrollViewer 到 ListView 的气泡滚动事件
- php - Symfony - (1/1) InvalidConfigurationException - “框架”下无法识别的选项“邮件程序”
- python - 根据 groupby 的结果对列进行排序
- homebrew - 尝试使用“brew tap aws/tap”命令在 ubuntu 上通过 brew 安装 aws-sam-cli,出现错误“致命:无法将 HEAD 解析为修订版”
- docker - Kubernetes - 如何引用文件共享以挂载卷?
- checkbox - 索引超出范围的 Blazor 复选框
- excel - 将工作簿另存为 xls 并删除模块