无法从Jupyter-lab笔记本中导入位于父文件夹中的模块和pathlib.Path。

7

以下是我的情况。我有一些Jupyter笔记本位于某个文件夹中,我希望通过一个自己制作的库在这些笔记本之间共享代码。

文件夹结构如下:

1.FirstFolder/
    notebookA.ipynb
2.SecondFolder/
    notebookB.ipynb
mylib/
    __init__.py
    otherfiles.py

我尝试把以下代码放在笔记本的开头:

# to use modules in parent folder
import sys
import os
from pathlib import Path
libpath = os.path.join(Path.cwd().parent,'mylib')
print(f"custom library functions are in the module:\n\t{libpath}")
sys.path.append(libpath)
import mylib

print函数输出了模块的正确路径,然后会出现ModuleNotFoundError导致程序崩溃:

---> 10 import mylib
     11 from mylib import *

ModuleNotFoundError: No module named 'mylib'

在Stack Overflow上查找,我发现那应该是从非默认文件夹导入模块的方式。哪里出错了?

编辑:按照FinleyGibson的答案,我尝试了sys.path.append(Path.cwd().parent)并重新启动了内核,但是仍然有同样的问题。

编辑2: 我尝试了这个方法,它起作用了,但我仍想知道为什么之前的方法不起作用。

import sys
import os
from pathlib import Path
tmp = Path.cwd()
os.chdir(Path.cwd().parent)
sys.path.append(Path.cwd())
import mylib
from mylib.dataloading import *
os.chdir(tmp)
2个回答

5
你已经将路径 os.path.join(Path.cwd().parent,'mylib')内容添加到了你的路径中,这意味着Python将在这个目录中查找你导入的模块。但是mylib并不在此目录中,而是在上一级目录中。Path.cwd().parent返回一个pathlib.PosixPath对象。将其转换为字符串以便于导入(或者只需使用sys.path.append('../')):

尝试:

import sys
import os
from pathlib import Path
sys.path.append(str(Path.cwd().parent))
import mylib

这样做让我能够像以下这样从otherfiles.py中导入一个变量X = 'import success':

ans = mylib.otherfiles.X
print(ans)

>>> 'import success'

1
我现在不确定这种方法是否有效。通常我会使用 from mylib import otherfiles 或者 from mylib.otherfiles import *。这两个方法都可以吗?如果不行,等我精神状态好一些再看看它。 - FinleyGibson
我注意到模块也被复制到笔记本文件夹中,这就是为什么它能工作的原因。现在我已经将其删除,它就不能再工作了。 - Gerardo Zinno
1
好的,我已经按照你描述的完全重建了设置,并得到了与你相同的错误。我可以看到两个错误;第一个是我们已经提到的,如果你想导入mylib,你需要将父目录添加到路径中,而不是mylib目录本身。第二个是Path.cwd().parent返回一个pathlib.PosixPath对象,无法被导入解释。将其转换为字符串后,问题得到了解决。我已经更新了我的答案,并提供了可行的代码供你尝试。 - FinleyGibson

3
我认为Jupiter无法找到你的模块文件夹。
第一个单元格使用。
cd ..

接着在下一个单元格中 - 这样应该可以正常工作

import mylib 

尝试在导入之前加入os.chdir(Path.cwd().parent),但问题仍然存在。 - Gerardo Zinno
在导入代码之前,将一个带有 cd .. 的单元格放置在该单元格中已经起作用了,但我认为这不是标准的 Python 代码,也不适用于 Windows 平台。而且,我正在处理的笔记本是一个共享项目,必须在多个操作系统上运行。 - Gerardo Zinno

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