Jupyter Notebook 中的 Python 相对导入

Posted

技术标签:

【中文标题】Jupyter Notebook 中的 Python 相对导入【英文标题】:Python Relative Import in Jupyter Notebook 【发布时间】:2020-07-18 09:24:38 【问题描述】:

假设我有以下结构:

 dir_1
 ├── functions.py
 └── dir_2
     └── code.ipynb

code.ipynb,我只是想访问functions.py 中的一个函数并尝试了这个:

from ..functions import some_function

我得到错误:

attempted relative import with no known parent package

我检查了一堆类似的帖子,但还没有弄清楚...我正在从 conda env 运行 jupyter notebook,我的 python 版本是 3.7.6

【问题讨论】:

笔记本相对于其他文件的位置在哪里? 示例中的笔记本为code.py。我会更新问题。 【参考方案1】:

在你的笔记本上做:

import os, sys
dir2 = os.path.abspath('')
dir1 = os.path.dirname(dir2)
if not dir1 in sys.path: sys.path.append(dir1)
from functions import some_function

【讨论】:

【参考方案2】:

jupyter notebook 从 sys.path 中的当前工作目录开始。 见sys.path

...包含用于调用 Python 解释器的脚本的目录。

如果您的实用程序函数在父目录中,您可以这样做:

import os, sys
parent_dir = os.path.abspath('..')
# the parent_dir could already be there if the kernel was not restarted,
# and we run this cell again
if parent_dir not in sys.path:
    sys.path.append(parent_dir)
from functions import some_function

【讨论】:

【参考方案3】:

你可以使用sys.path.append('/path/to/application/app/folder')然后尝试导入

【讨论】:

谢谢!我真的很想避免说明明确的路径。有没有办法解决这个问题?为什么会出现上述错误? 看看***.com/questions/16981921/… 我相信问题是由于您的相对导入。您可能想尝试类似 python3 -m dir_2/code.py 不确定我是否理解。我正在运行一个 jupyter 笔记本,重点是我想使用相对路径并避免显式路径。 为了能够使用相对路径,您应该在包中工作。 '换句话说,解析模块的算法是基于 namepackage 变量的值。在您的情况下,您没有包,因此 package 没有。您需要有 init.py 才能使您的目录成为一个包。这里详细介绍了两种不同的解决方案:napuzba.com/a/import-error-relative-no-parent/p2

以上是关于Jupyter Notebook 中的 Python 相对导入的主要内容,如果未能解决你的问题,请参考以下文章

怎么更改jupyter文件位置?

Jupyter Lab 中的 Jupyter Notebook 扩展

Jupyter Notebook 中的 Handsontable

PySpark 和 Jupyter-notebook 中的 Collect() 错误

python 显示Jupyter Notebook中的所有列。

在Jupyter notebook中使用特定虚拟环境中的python的kernel