【问题标题】:Cannot import a module which is in jupyter path无法导入 jupyter 路径中的模块
【发布时间】:2020-02-04 13:34:49
【问题描述】:

我在 jupyter 笔记本中编写我的模块并将它们存储在一个文件夹中,例如,/Users/me/myModules(注意:实际路径包含空格,这有关系吗?)

我想从位于不同位置的其他 jupyter 笔记本导入它们。由于模块具有 .ipynb 扩展名,因此我以 import import_ipynb 开始我的代码。

我关注this answer并添加了

export JUPYTER_PATH="${JUPYTER_PATH}:/Users/me/myModules"

到我的 bash_profile 文件的第一行,并保存。然后我在终端运行source ~/.bash_profile

现在,当我在终端中运行 jupyter --paths 时,我可以在数据部分(而不是配置或运行时部分)下看到 myModules 文件夹的路径。

但是,在我的 jupyter 笔记本中

import import_ipynb
import myFirstModule

给出一个 ModuleNotFoundError: no module named 'myFirstModule'。我正在使用 Python 3.6.10 (Anaconda)。

如何从 jupyter 路径导入模块?

(其实我找到了解决方案,只需在每个笔记本的开头输入%cd '/Users/me/myModules',然后每个保存的文件(例如导出的图像)都会进入 myModules 文件夹,这是我不想)

【问题讨论】:

  • 您是否也尝试将您的路径添加到PYTHONPATH? IE。 export PYTHONPATH="$PYTHONPATH:/Users/me/myModules"
  • @TomaszBartkowiak 是的,我试过了,没用。我不知道它是否会有所帮助,但我的 bash 配置文件的第一行是 export PATH="/Users/me/anaconda3/bin:$PATH" (我没有写那行)
  • /Users/me/myModules 中是否有 __init__ 文件? which python 是否指向适当的 anaconda 环境?您是否在笔记本中使用相同的环境? (笔记本里面!which python的输出是什么)?你的模块在import sys; sys.path的输出中吗?
  • @TomaszBartkowiak 我在 myModules 文件夹中有一个名为 init.py(init 前后两个下划线)的空文件。 which python in terminal 和 !which python in notebook 提供相同的文件夹: /Users/me/anaconda3/bin/python 。导入系统; sys.path 包括 myModules 文件夹

标签: python jupyter-notebook


【解决方案1】:

如果没有更多详细信息,我无法重现您的问题,但我想为您提供一些解决方法,让您在不更改 Jupyter 目录的情况下将模块加载到 /Users/me/myModules

import os
from importlib.util import spec_from_file_location, module_from_spec

path = 'full/path/to/Users/me/myModules'

for fn in os.listdir(path):
    fp = os.path.join(path, fn)
    spec = spec_from_file_location(fn, fp)
    mod = module_from_spec(spec)
    spec.loader.exec_module(mod)

运行这段代码后,你的模块就已经被导入并可以免费使用了。

【讨论】:

    【解决方案2】:

    我认为执行“笔记本间”导入的最佳方式是使用 %run 魔术:

    %run `full/path/to/the/notebook.ipynb`
    

    ...没有%cd

    这是一个示例:2 个笔记本位于不同的位置,mySecondModule 执行 myFirstModule 的导入。

    【讨论】:

    • 请注意,这可能会覆盖第二个模块中的某些名称。您的解决方案等同于 from module import *,在某些情况下可能不是最佳方法。
    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 2021-01-08
    • 2021-05-19
    • 1970-01-01
    • 2017-05-26
    • 2017-10-09
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多