假设我们有一个如下的文件结构,
#注意:不是实际的目录结构,而是类似的
root../
tests../
src../
__init__.py
utils../
__init__.py
data.py
pipeline.py
sqlal../
__init__.py
sql_alchm.py
test.py
process.ipynb
这里是 data.py 的示例
from abc import ABC
class DataStrategy(ABC):
pass
这里是 test.py 的示例| ||现在我尝试运行我的 jupyter 笔记本 process.ipynb 中的所有导入,我收到如下错误
from utils.data import DataStrategy
class TestPipeline(DataStrategy):
pass
但是如果我运行文件 test.py 我没有收到错误,这个错误是否与此有关与笔记本的范围...或者我错过了什么?
import os
from src.test import Test Pipeline
File c:\Users\ASUS\Desktop\AI-Projects\EasyML\ml_backend\src\data_scaling.py:9
7 import pandas as pd
8 from sklearn.base import *
----> 9 from utils.pipelines.pipeline import BasePipeline, Pipeline, DataStrategy
11 # enable_iterative_imputer()
13 class Scaler(DataStrategy, BasePipeline):
ModuleNotFoundError: No module named 'utils'
But if I run the file test.py I am not getting the error, Is this error has something to do with the scope of the notebook... or am I missing something?
你遇到的错误是因为Jupyter Notebook和你的
test.py
文件对模块搜索路径的解释不同。
问题根源:
-
相对导入:
你的代码使用的是
相对导入
,例如
from utils.data import DataStrategy
。相对导入是相对于 当前模块 而言的。在你的test.py
文件中,由于它本身就在src
文件夹下,所以 Python 能够正确地找到utils
模块。 -
Jupyter Notebook 的工作目录:
Jupyter Notebook 的工作目录通常是你启动 Notebook 的目录,而不是 Notebook 文件本身所在的目录。因此,当你尝试在 Notebook 中使用相对导入时,Python 会从 Notebook 的
工作目录
开始搜索,而不是从 Notebook 文件所在的目录开始搜索,导致找不到
utils
模块。
解决方案:
你有几种方法可以解决这个问题:
1. 使用绝对导入:
-
将
src
文件夹添加到 Python 的模块搜索路径中。你可以在 Notebook 的开头添加以下代码:python import sys sys.path.append(r'C:\Users\ASUS\Desktop\AI-Projects\EasyML\ml_backend') # 替换成你项目的实际路径
- 然后,你可以使用绝对导入来引用你的模块:python from src.utils.data import DataStrategy
2. 将项目转换为包:
-
在你的
root
目录下创建一个空的setup.py
文件。 -
在你的 Notebook 中,使用
pip install -e .
命令安装你的项目。这会将你的项目作为一个包安装到你的环境中,并允许你使用绝对导入。
3. 改变 Jupyter Notebook 的工作目录:
-
你可以使用
os
模块在 Notebook 的开头设置工作目录:python import os os.chdir(r'C:\Users\ASUS\Desktop\AI-Projects\EasyML\ml_backend\src') # 替换成你的 src 文件夹的路径
- 然后你可以像在test.py
文件中那样使用相对导入。
推荐方案:
我建议你使用 将项目转换为包 的方法,因为它更符合 Python 的最佳实践,并且使得你的代码更易于维护和分发。
希望这些信息能帮助你解决问题!
标签:python,machine-learning,data-science,jupyter,importerror From: 78837738