“从未来导入绝对导入”不会禁用Jupyter笔记本中的相对导入。如何修复?

2024-05-14 03:03:05 发布

您现在位置:Python中文网/ 问答频道 /正文

从这篇文章中:

Python: Disabling relative import

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

from __future__ import absolute_import

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

enter image description here

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

^{pr2}$

如何在Jupyter笔记本或Jupyter lab中修复它?这是否意味着我无法避免相对进口?在

更新:非常感谢您的回答,其中之一是建议我有一个损坏的Python路径(或搜索路径),不是这样,我添加了以下一行来显示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


Tags: pathfromimport路径networkxhomeoslib
1条回答
网友
1楼 · 发布于 2024-05-14 03:03:05

相对进口与此无关。正在发生的是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时,它将依次遍历这些目录中的每一个,以查找{}。它首先在你的“无标题文件夹”中找到一个。在

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

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

相关问题 更多 >