【问题标题】:Python ModuleNotFoundError: No module named 'src'Python ModuleNotFoundError:没有名为“src”的模块
【发布时间】:2021-03-09 05:28:39
【问题描述】:

我知道这是一个常见问题,但不知何故对我不起作用。 这是我的项目结构:

MAIN
| --src
     | -- _init__.py
     | -- data 
            | -- __init__.py
            | -- operation.py
      | start
          | __init__.py
          | go.py

在 go.py 文件中我有:

from src.data.operation import X

当我从 MAIN 目录启动 go 文件时:

python src/start/go.py

它抛出: ''' ModuleNotFoundError:没有名为“src”的模块 '''

我该如何解决?

【问题讨论】:

标签: python


【解决方案1】:

问题是您正在运行src.start.go,就好像它是一个脚本一样,即通过提供python 命令的完整路径:

python src/start/go.py

这使得 Python 认为这个 go.py 文件是一个独立的脚本,它不属于任何包的一部分。如文档中所定义(参见here<script> 下),这意味着 Python 将在与脚本相同的目录中搜索模块,即 src/start/

如果脚本名称直接引用 Python 文件,则目录 包含该文件被添加到sys.path 的开头,并且该文件 作为__main__ 模块执行。

当然src不在src/start/中,所以会抛出错误。

启动作为包一部分的脚本的正确方法是使用 -m 开关 (reference),它将模块路径作为参数并将该模块作为脚本执行(但保持当前工作目录作为模块搜索路径):

如果给出此选项,[...] 当前目录 将添加到sys.path 的开头。

所以你应该使用以下命令来启动你的程序:

python -m src.start.go

现在当src.start.go 尝试导入src 包时,它将在您当前的工作目录(包含src/... 树)中搜索并成功。


作为个人建议:不要将可运行的脚本放在包中。仅使用包来存储所有逻辑和功能(函数、类、常量等),并编写一个单独的脚本以按照您的意愿运行您的应用程序,并将其放在包外部。这将使您免于此类问题,并且还有一个优点是您可以为同一个包编写多个运行配置,只需为每个包编写一个单独的启动脚本。

【讨论】:

  • 那么我们该如何解决这个问题
  • 他正在尝试将该文件中的一个函数导入另一个文件,在 CLI 上运行类似的东西是否合适。
  • @coderboy 是的;问题是他们如何启动脚本,而不是他们如何导入其他模块。
  • 0 运行命令:python -m src.start.go 像魅力一样工作。现在,我有 4 台 GPU 机器,当我尝试像这样以分布式模式运行脚本时: python -m torch.distributed.launch --nproc_per_node=4 src.start.go 它给我一个错误:'no module src ' 它发生在添加分布式模式之后。我该如何解决@Anakhand?
  • @Josh,你最好单独提出一个问题,这可能与pytorch 如何加载模块以及你如何配置环境有关。
【解决方案2】:

检查文件结构,第一棵树应该有 init.py 而不是 init_.py

MAIN
| --src
     | -- __init__.py
     | -- data 
            | -- __init__.py
            | -- operation.py
      | start
          | __init__.py
          | go.py

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2020-11-20
    • 2021-06-03
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多