【问题标题】:Can't import module situated in parent folder from Jupyter-lab notebook and pathlib.Path无法从 Jupyter-lab 笔记本和 pathlib.Path 导入位于父文件夹中的模块
【发布时间】:2021-02-10 03:45:57
【问题描述】:

这是我的情况。我在某个文件夹中有一些 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

打印输出模块的正确路径,然后出现ModuleNotFoundError,程序崩溃:

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

ModuleNotFoundError: No module named 'mylib'

查找 SO,我发现这应该是从非默认文件夹导入模块的方法。 错误在哪里?

编辑:在 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)

【问题讨论】:

    标签: python python-3.x jupyter-notebook python-import


    【解决方案1】:

    您已将os.path.join(Path.cwd().parent,'mylib')内容 添加到您的路径中,这意味着python 将在此目录中查找您正在导入的模块的insidemylib 不在此目录中,而是位于父目录中。同样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'
    

    【讨论】:

    • 感谢您的回答。你的回答很有道理,但我还是有同样的问题。
    • 我现在不确定这种方法是否可行。我通常会做from mylib import otherfilesfrom mylib.otherfiles import *。这些都行吗?如果没有,我会在不那么累的时候再看看它。
    • 成功了!我接受你的回答,你能把评论也放在答案里吗?
    • 太棒了。完成了。稍后我会添加更完整的解释。
    • 好的,所以我重新创建了您描述的确切设置,并得到了与您相同的错误。我可以看到两个错误;我们已经提到的第一个是,如果要导入 mylib,则需要将父目录添加到路径,而不是 mylib 目录本身。第二个是Path.cwd().parent 返回一个 pathlib.PosixPath 对象,该对象不能通过导入来解释。将其转换为字符串为我解决了这个问题。我已经用工作代码更新了我的答案供您尝试。
    【解决方案2】:

    我认为 Jupiter 无法找到您的模块所在的文件夹。

    第一次使用细胞

    cd ..
    

    然后在下一个单元格中 - 然后它应该可以工作

    import mylib 
    

    【讨论】:

    • 尝试在导入之前放置os.chdir(Path.cwd().parent),但我仍然有问题
    • 在导入的单元格之前使用cd .. 放置一个单元格,但我认为它不是标准的python 也不可移植到Windows。我正在开发的笔记本是一个共享项目,必须在多个操作系统上运行
    猜你喜欢
    • 2016-03-01
    • 2021-04-24
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多