【问题标题】:Python can't find my custom module in a folder with __init__.pyPython 在带有 __init__.py 的文件夹中找不到我的自定义模块
【发布时间】:2021-12-11 22:05:47
【问题描述】:

虽然有多个关于自定义模块未找到错误的堆栈溢出帖子,但这些解决方案(例如this one)对我的情况没有帮助。

我的文件夹结构是这样的:

project
|-- app
|   |-- script.py
|-- src
|   |-- __init__.py
|   |-- file.py

在我的script.py 我有这个代码

import pandas as pd
import streamlit as st
from project.src.file import func

在windows7机器上使用VS Code,我把目录改成project,并激活了conda虚拟环境,然后执行代码streamlit run app\script.py,出现这个错误

ModuleNotFoundError: No module named 'project'

将脚本更改为from src.file import func 导致此错误

ModuleNotFoundError: No module named 'src'

有人可以解释发生了什么吗?为什么即使我在文件夹 src 中有所需的 __init__.py,Python 也找不到我的自定义模块。

【问题讨论】:

  • 如果不是 Windows,您需要运行 app/script.py(正向)斜杠,而不是反斜杠。如果您的当前目录是项目,那么您的模块是 src.file,而不是 project.src.file。并且项目不是一个包,因为它没有_ _ init _ _.py,只有它的子目录。
  • @YuriFeldman,我的机器是 Windows 7。不幸的是,更改为 from src.file import func 不起作用。
  • 然后我会检查 file.py 是否包含一个 func 并且您当前的目录确实是项目(import os; print(os.getcwd()) 在导入之前)。后者实际上是主要嫌疑人。与任何其他编程项目一样,我还将确保其路径(从分区根目录开始)不包含非 ASCII 字符(例如您的用户名),也不包含空格。

标签: python python-import importerror streamlit


【解决方案1】:

你需要将script.py中的import改为

from src.file import func

并在 project 目录中使用

运行它
python -m app.script

由于你使用的是streamlit,显然它不支持运行模块,你可以试试this Github issue提供的方法:

  1. 在您的项目目录中创建一个名为 run.py 的文件,其内容如下:
import runpy

runpy.run_module("app.script", run_name="__main__", alter_sys=True)
  1. 运行 streamlit 命令:
streamlit run run.py

【讨论】:

  • 我必须使用命令streamlit run... 运行script.py。当我按照您的建议尝试streamlit run -m app.script 时,我收到此错误no such option: -m
  • 检查我更新的答案。
  • 谢谢恩佐。我稍后会尝试您的建议,但我的主要问题是为什么 Python 无法找到我的自定义模块,尽管我在 src 文件夹中有所需的 __init__.py
  • 这与Python无关,但与streamlit库有关。您正在模块中构建项目,因此应该使用python -m 运行它。由于streamlit只允许运行单个文件,所以会出现导入错误。
  • 您能否详细说明单个文件的含义?该脚本还导入了 2 个其他“文件”(pandas 和 streamlit),但该错误仅发生在我的自定义模块中。
【解决方案2】:

原来我的 VS Code 中的 python 解释器不知道我的project 文件夹的路径。

按照this suggestion,我在我的VS代码中设置PYTHONPATH如下:

set PYTHONPATH=%PYTHONPATH%;path\to\the\folder\project

script.py 中的代码为from src.file import func

命令streamlit run app\script.py 然后正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2022-01-14
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多