在不同的上下文中导入模块

import module in different contexts

我有这样的文件结构:

work/
├─ analysis.ipynb
├─ app/
│  ├─ __init__.py
│  ├─ class_a.py
│  ├─ script.py
│  ├─ utils.py

文件 class_a.py 包含 class MyClass 以及从 utils 导入的内容,如下所示:

from utils import useful_function

class MyClass():
    ...

然后我尝试像这样在 analysis.ipynb 中导入 MyClass

from app.class_a import MyClass

并得到一个错误:

ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-4-8eeb8559d767> in <module>
      2 import os
      3 from datetime import datetime
----> 4 from app.class_a import MyClass
      5 from app.utils import useful_function
      6 ...

~/Documents/work/app/class_a.py in <module>
      1 import pandas as pd
----> 2 from utils import useful_function
      3 
      4 class MyClass():
      5     '''indeed very necessary class for me

ModuleNotFoundError: No module named 'utils'

我发现如果我将 app 文件夹中的所有导入更改为如下内容:

from app.utils import useful_function

然后我可以从analysis.ipynb

导入我需要的所有东西

但是 app 应该像我 运行 和 python script.py 一样工作,除非以原始方式编写导入,否则这不起作用。

我不了解模块和包装,所以甚至不能准确地问一个问题,但是我如何对齐导入“样式”以便能够 运行 python scripts.pyapp 目录并从 analys.ipynb?

导入 MyClass

import 语句搜索 sys.path 中的路径列表,所以我将这些行添加到我的 analysis.ipynb:

import sys
sys.path.append('/path/to/work/app/')

以防有人和我有同样的疑问和挣扎。