我具有以下项目结构:
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'
我在做什么错了?
答案 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
软件包,因此可以按预期使用utils
和conf
。
如果您使用绝对导入,则测试会失败,因为python现在正在utils
上寻找sys.path
。但是python3 xxx.py
起作用是因为本地文件夹已添加到您的sys.path
中。
一种干净的解决方案是从main.py
和utils.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的最高层位于xxx
,xxx.conf
等。
使用conf
开关从父文件夹运行您的应用程序:
utils
请注意,避免命名子包(例如主包)是个好主意。这样可以避免混乱,特别是当您或其他人将来必须维护您的包裹时。