ModuleNotFoundError: нет модуля с именем 'xxx.conf';«ххх» не является пакетом - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующая структура проекта:

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 голосов
/ 28 сентября 2018

Ваш вопрос очень похож на ModuleNotFoundError: Нет модуля с именем 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()
0 голосов
/ 28 сентября 2018

Когда я запускаю свое приложение с

python3 xxx.py

Это означает, что ваш текущий рабочий каталог внутри пакета xxx.Нет xxx.conf, чтобы обнаружить, потому что верхний уровень, видимый для Python, находится на conf, utils и т. Д.

Запустите приложение из родительской папки, используя переключатель -m:

python3 -m xxx.xxx

Обратите внимание, что рекомендуется избегать именования субпакетов, таких как основной пакет.Это позволяет избежать путаницы, , особенно , когда вы или кто-то еще должны поддерживать ваш пакет в будущем.

0 голосов
/ 28 сентября 2018

Является ли имя вашего пакета xxx.py?

Если эти два имеют одинаковое имя, Python импортирует xxx.py, а не пакет xxx, потому что Python ищет пакеты в sys.path последовательно, ипервой записью обычно является текущий каталог (проекта).

В противном случае, если у вас есть только python xxx.py, sys.path будет иметь текущий путь в пакете xxx, но если вы используете pytest import xxx,текущий не в пакете xxx, python не найдет пакет или .py в пакете xxx и не сможет найти utils.py и conf.py, в этом случае вы можете попробовать написать from . import * в _ init _.py или в xxx.py напишите from . import utils, conf

...