ModuleNotFoundError:没有名为“ xxx.conf”的模块; “ xxx”不是软件包

时间:2018-09-28 14:30:39

标签: python python-import python-3.7

我具有以下项目结构:

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'

我在做什么错了?

3 个答案:

答案 0 :(得分:0)

您的包裹名称是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或xxx.py中将from . import *写入from . import utils, conf

答案 1 :(得分:0)

您的问题与ModuleNotFoundError: No module named x

非常相似

运行python3 xxx.py时,它将成为主要模块,因此它正在寻找类似xxx/xxx/xxx/utils.py的东西。 当您运行pytest时,它将知道xxx软件包,因此可以按预期使用utilsconf

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

一种干净的解决方案是从main.pyutils.py向上创建一个conf.py,然后从那里导入代码,例如:

# main.py
from xxx import utils, conf

def main():
    # do stuff here

if __name__ == __main__:
    main()

答案 2 :(得分:0)

  

当我运行我的应用程序时

{% if messages %}
    {% for message in messages %}
        <div class="message">{{ message }}</div>
    {% endfor %}
{% endif %}

这意味着您当前的工作目录位于<script> $(document).ready(function() { setTimeout(function() { $('.message').fadeOut('slow'); }, 2000); }) </script> 包的内部。找不到python3 xxx.py ,因为python的最高层位于xxxxxx.conf等。

使用conf开关从父文件夹运行您的应用程序:

utils

请注意,避免命名子包(例如主包)是个好主意。这样可以避免混乱,特别是当您或其他人将来必须维护您的包裹时。