将Python模块从父目录导入到位于子目录中的Jupyter Notebook文件

22

我的文件目录结构如下:

project_folder/
     notebooks/
          notebook01.ipynb
          notebook02.ipynb
          ...
          notebookXY.ipynb
     module01.py
     module02.py
     module03.py

我希望能够从notebook/文件夹中的.ipynb文件中导入来自module01.py,module02.pymodule03.py的类和函数。

我在这个问题中找到了答案。可以使用以下代码将其放置在每个笔记本中,并且每次运行时作为第一个单元格运行:

import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path)

请问有更好的方法吗?如果我在notebooks/文件夹中有很多个.ipynb文件,我是否需要在每个文件的开头粘贴这些代码?有更好、更简洁或更清晰的方式吗?

2个回答

6
另一个解决方案是将所有Python模块(.py文件)移动到一个文件夹中并使它们成为可安装的包。如果您将其通过pip安装到当前环境中,那么您可以在该环境中的任何笔记本中导入该软件包,而不考虑文件夹结构。
所以在您的情况下,您可以有:
project_folder/
  notebooks/
    notebook01.ipynb
    notebook02.ipynb
    ...
    notebookXY.ipynb
  my_package/
    __init__.py
    module01.py
    module02.py
    module03.py
  setup.py
  • __init__.py可以是一个空文件,告诉Python“这个文件夹中的所有内容都是一个软件包的一部分”。
  • 有关setup.py应该包含哪些内容的解释,请参见此处

一个基本的setup.py可以非常简单,如下所示:

import setuptools

setuptools.setup(
    name="my_package",
    version="0.0.1",
    description="A small example package",
    packages=setuptools.find_packages(),
    python_requires='>=3.7',
)

安装它:

cd project_folder
pip install [-e] .

包括可选的-e标志将以“可编辑”模式安装my_package,这意味着不会将文件复制到虚拟环境中,而是会创建指向它们所在位置的符号链接。
现在,在任何笔记本中,您都可以执行以下操作: import my_package 或者 from my_package.module01 import

你应该将setup.py文件放在my_package文件夹中。在我的情况下,它无法在文件夹中找到必要的文件。如果它在同一个文件夹中,它可以完美地工作。非常感谢,非常有帮助。 - Manthano
你好,这是一个非常有用的答案。但是,当我尝试在与上述相同的设置中从其中一个笔记本(notebook01.ipynb)安装my_package时,它无法工作,因为工作目录位于notebooks而不是父项目文件夹中。有没有一种好的方法来处理这个问题?例如,使所有笔记本都将工作目录设置为project_folder或其他解决方案? - A_Murphy

5
尝试将 project_folder 添加到您的 PYTHONPATH 环境变量 中。这样可以告诉 Python 在该目录中搜索导入模块。
您可以在用户个人资料设置或启动脚本中进行设置 - 不要在 Python 中设置。这是必须在运行 Python 之前设置的内容。

请问我该如何做到这一点? - PeterB
你是如何运行 ipynb 文件的?是通过命令行,鼠标点击还是其他方式? - aghast
7
在 Jupyter Notebook 中点击,我可以通过运行带有代码的单元格来实现: sys.path.append(os.path.dirname(os.getcwd())) 但是这并不能永久解决我的问题,只能在重新启动内核之前使用,这几乎与我问题描述中的原始解决方案相同。 - PeterB
你使用的是哪个操作系统? - aghast
我正在使用Ubuntu。 - PeterB
尝试在您的~/.profile文件中执行export PYTHONPATH="$HOME/path/to/project_folder:$PYTHONPATH"。(谷歌返回了很多此类结果。) - aghast

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