Jupyter Notebook中的Python相对导入

13

假设我有以下结构:

 dir_1
 ├── functions.py
 └── dir_2
     └── code.ipynb
code.ipynb中,我想要访问functions.py里面的一个函数,我尝试了以下代码:

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

from ..functions import some_function

我收到了错误信息:

attempted relative import with no known parent package

我查看了很多类似的帖子,但还没有解决这个问题... 我正在从一个conda环境中运行jupyter笔记本,我的python版本是3.7.6


笔记本相对于其他文件位于哪里? - Mr_and_Mrs_D
示例中笔记本将是 code.py。 我会更新问题。 - CHRD
4个回答

9
在您的笔记本上执行以下操作:
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

5

jupyter笔记本从当前工作目录开始搜索引入模块的路径(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

2

给定如下结构:

 dir_1
 ├── functions
 │   └──__init__.py  # contains some_function
 └── dir_2
     └── code.ipynb

我们只是将相对路径插入到sys.path中:
import sys

if ".." not in sys.path:
    sys.path.insert(0, "..")
from functions import some_function

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

谢谢!我真的想避免明确指定路径。这方面没有其他解决方法吗?为什么会出现上述错误? - CHRD
请查看 https://dev59.com/2WQn5IYBdhLWcg3wP1JT - user9659728
我认为问题是由于你的相对导入引起的。你可以尝试类似 python3 -m dir_2/code.py 的东西。 - user9659728
不确定我是否理解。我正在运行Jupyter笔记本,而整个重点是我想使用相对路径并避免显式路径。 - CHRD
1
为了能够使用相对路径,您应该在包中工作。换句话说,解析模块的算法基于__name__和__package__变量的值。在您的情况下,您没有一个包,所以__package__是none。您需要有__init__.py来使您的目录成为一个包。这里有两种不同的解决方案:https://napuzba.com/a/import-error-relative-no-parent/p2 - user9659728
另外,通常建议不要使用相对路径,因为模块往往会经常移动。所以请考虑这一点。 - user9659728

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接