【问题标题】:ModuleNotFoundError: No module named 'xxx.conf'; 'xxx' is not a packageModuleNotFoundError:没有名为“xxx.conf”的模块; 'xxx' 不是一个包
【发布时间】:2018-09-28 14:30:39
【问题描述】:

我的项目结构如下:

xxx
├── xxx
|   ├── settings
|   └── tests
|   └── __init__.py
|   └── conf.py
|   └── xxx.py
|   └── utils.py

这些是我在每个文件中的导入。

xxx.py

from xxx import utils, conf
from xxx.conf import BASE_DIR

conf.py

import os
import yaml

utils.py

import os
import shutil
from typing import List, Optional, Tuple, Dict, Union
import requests

当我运行我的应用程序时

python3 xxx.py

我收到以下错误:

ImportError: cannot import name 'utils' from 'xxx' (/Users/yyyyy/workscpace/xxx/xxx/xxx.py)

当我使用 pytest 运行我的测试套件时,我没有收到任何错误。

我尝试将导入更改为(因为这些文件是我的包中的模块):

import utils
import conf

在这种情况下,我可以正常运行我的应用程序,但在尝试运行 pytest 时出现以下错误

ModuleNotFoundError: No module named 'utils'

我做错了什么?

【问题讨论】:

  • __init__.py 中有什么内容?
  • 没什么,是空的
  • 除非你有一个非常、非常、非常好的理由来命名一个像父包一样的子包:不要。它可以避免很多的头痛。
  • 顶部的“xxx”文件夹是项目根目录,而不是包。

标签: python python-import python-3.7


【解决方案1】:

您的问题与ModuleNotFoundError: No module named x非常相似

当你运行python3 xxx.py 时,它会成为主模块,所以它会寻找类似xxx/xxx/xxx/utils.py 的东西。 当您运行pytest 时,它会知道xxx 包,因此会按照您的预期选择utilsconf

如果你使用绝对导入,测试会失败,因为 python 现在正在 sys.path 上寻找 utils。但是python3 xxx.py 有效,因为本地文件夹已添加到您的sys.path

一个干净的解决方案是创建一个比utils.pyconf.py 高一级的main.py 并从那里导入您的代码,例如:

# main.py
from xxx import utils, conf

def main():
    # do stuff here

if __name__ == __main__:
    main()

【讨论】:

    【解决方案2】:

    当我运行我的应用程序时

    python3 xxx.py
    

    这意味着您当前的工作目录xxx 包中。没有xxx.conf 可以发现,因为python 看到的顶层是confutils 等。

    使用-m 开关从父文件夹运行您的应用:

    python3 -m xxx.xxx
    

    请注意,避免像主包一样命名子包是个好主意。这可以避免混淆,尤其是当您或其他人必须在将来维护您的包时。

    【讨论】:

    • 我可以使用python -m xxx.xxx 运行我的应用程序,这是为什么呢?在“主包”中,您指的是顶部的“xxx”文件夹吗?这只是项目(和存储库)根目录,它不是包。
    【解决方案3】:

    你的包裹名称是xxx.py吗?

    如果这两个名称相同,Python 将导入 xxx.py 而不是包 xxx,因为 Python 会按顺序在 sys.path 中查找包,并且第一个条目通常是(项目的)当前目录。

    否则,如果你只有python xxx.py,sys.path会有xxx包中的当前路径,但是如果你使用pytest import xxx,当前不在xxx包中,python将找不到xxx包或.py打包,找不到 utils.py 和 conf.py 在这种情况下,您可以尝试在 _ init _.py 中写入 from . import * 或在 xxx.py 中写入 from . import utils, conf

    【讨论】:

    • 嗨@jbwabg,你能澄清你的答案吗?我认为你在这里提出了一个很好的观点,只是有点不清楚......
    猜你喜欢
    • 2020-09-09
    • 2020-12-06
    • 2020-12-27
    • 2021-10-12
    • 2020-10-04
    • 2020-07-02
    • 2021-05-17
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多