从父目录中的 python 模块导入到子目录中的 jupyter notebook 文件中

Posted

技术标签:

【中文标题】从父目录中的 python 模块导入到子目录中的 jupyter notebook 文件中【英文标题】:Importing from python modules inside parent directory into jupyter notebook files inside subdirectory 【发布时间】:2017-10-04 15:14:02 【问题描述】:

我有这样的文件结构:

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

notebook/ 文件夹内的.ipynb 文件中,我想从module01.py, module02.pymodule03.py 导入类和函数。

我在question 中找到了答案,可以在每个笔记本中使用以下代码行,并且每次都将这些行作为第一个单元格运行:

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 文件怎么办,我是否必须在每个文件的开头粘贴这些代码行?有没有更好、更简约或更干净的方式?

【问题讨论】:

【参考方案1】:

尝试将project_folder 添加到您的PYTHONPATH environment variable. 这将允许您告诉python 在该目录中搜索导入。

您可以在您的用户配置文件设置中或在您的启动脚本中执行此操作 - 而不是在 python 中。这是在 python 运行之前必须设置的东西。

【讨论】:

请问我该怎么做? 您如何运行ipynb 文件?从命令行,通过鼠标点击,其他的? 点击 Jupyter Notebook,我可以通过运行带有代码的单元来做到这一点:sys.path.append(os.path.dirname(os.getcwd())) 但它并不能永久解决我的问题,直到我重新启动内核,它几乎与我的原始解决方案相同Q体 你使用的是什么操作系统? 我使用的是 Ubuntu【参考方案2】:

另一个解决方案是将所有 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 中的内容,请参阅 here。

一个基本的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 <some object>

【讨论】:

您应该将 setup.py 文件也放入 my_package 文件夹中。就我而言,它在文件夹中找不到必要的文件。如果它在同一个文件夹中,它可以完美地工作。非常感谢。很有帮助。 嗨,这是一个非常有用的答案,但是当我尝试从其中一个笔记本 (notebook01.ipynb) 以与上述相同的设置安装 my_package 时,由于工作目录位于笔记本而不是父 project_folder。有没有办法很好地处理这个问题? IE。所以所有笔记本都是在工作目录设置为 project_folder 或其他解决方案的情况下创建的?

以上是关于从父目录中的 python 模块导入到子目录中的 jupyter notebook 文件中的主要内容,如果未能解决你的问题,请参考以下文章

从目录导入python中的用户定义模块

Python:列出子目录中的导入选项,然后导入其中一个[重复]

Nextjs 从父目录导入外部组件

如何从python中的其他目录导入模块? [复制]

对如何从模块中的其他目录/父目录导入感到困惑(python 3)

使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入