ModuleNotFoundError при импорте пакета из папки src

Что не так с этой структурой python? Я прочитал несколько документов и форумов по этой проблеме, я просто не могу решить ее.

.
└── src
    ├── __init__.py
    ├── lib
    │   ├── hello.py
    │   └── __init__.py
    ├── libtwo
    │   ├── __init__.py
    │   └── world.py
    └── main.py

мир.py

def helloworld():
    print("Hello World!")

привет.py

from libtwo.world import helloworld

helloworld()

main.py

from libtwo.world import helloworld

helloworld()

(он отлично работает из main.py)

  File "src/lib/hello.py", line 1, in <module>
    from libtwo.world import helloworld
ModuleNotFoundError: No module named 'libtwo'

следующее дает

  File "lib/hello.py", line 1, in <module>
    from ..libtwo.world import helloworld
ImportError: attempted relative import with no known parent package
from ..libtwo.world import helloworld

helloworld()

используя VSCode я пытался настроить рабочие пространства и конфиги, все много. "python.terminal.executeInFileDir": true

(да, я использую виртуальную среду)

записи системного пути virtualenv.

согласно некоторым источникам, если я не вижу свой каталог в virtualenv, это означает, что что-то не так

(my_venv) ➜  src python main.py 
>>> import sys
>>> sys.path
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/user/Documents/py/myui/subject_a/my_venv/lib/python3.8/site-packages']
>>> 

запуск sys.path из main.py

(my_venv) ➜  src python main.py 
['/home/user/Documents/py/myui/subject_a/src', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/user/Documents/py/myui/subject_a/my_venv/lib/python3.8/site-packages']

Я действительно не могу точно определить, что не так с моей структурой, я занимаюсь этим годами, и сегодня, похоже, ничего не работает.

попробуй src.libtwo.world import helloworld

Sergio2405 14.02.2023 17:59

@ Sergio2405 та же проблема, я бы подумал, что это сработает, потому что это корень проекта, но все та же проблема

Fanna1119 15.02.2023 03:03

Я не могу воспроизвести вашу ошибку, я пробовал на своем ноутбуке с вашей точной структурой и множеством конфигураций и рабочей среды, у меня это работает.

Dorian Turba 15.02.2023 09:11

@DorianTurba моя проблема была вызвана проблемой пути python

Fanna1119 15.02.2023 15:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем файле hello.py вы импортируете модуль, используя libtwo.world. Это означает, что Python должен искать модули в каталоге src.

Когда вы запускаете main.py, он работает нормально, потому что Python ищет модули в рабочем каталоге, которым является src.

Вы можете установить PYTHONPATH, чтобы явно указать путь поиска файлов модулей. См. https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH.

export PYTHONPATH=$(pwd)/src
python src/lib/hello.py

это ответ, который я искал. У меня было ощущение, что это связано не со структурой моего кода, а с проблемой пути, спасибо за это. я попытался установить это в самом vscode без везения, но это придется сделать

Fanna1119 15.02.2023 15:04

иногда vscode не обнаруживает папку пакета, поэтому вы можете добавить ее в свой settings.json

"terminal.integrated.env.linux": {
    "PYTHONPATH": "${workspaceFolder}/src"
}

Другие вопросы по теме

Как сгенерировать 10000 случайных чисел в диапазоне 30,40
Lxml не удается импортировать с ошибкой "символ не найден в плоском пространстве имен" _xsltDocDefaultLoader'`
Python и Starlette: выполнение длинной асинхронной задачи
Как выполнить разделение строк, используя регулярное выражение в качестве ссылки, и чтобы часть используемого шаблона разделителя не удалялась из следующей строки?
Как правильно повернуть фрейм данных, чтобы значения первого столбца были моими новыми столбцами?
Дочерний класс из объекта MagicMock имеет странную спецификацию = 'str' и не может использовать или имитировать методы класса
Создать новый столбец на основе количества других столбцов
Как я могу добавить элемент в список из файла JSON в Python?
Почему я получаю сообщение об ошибке при использовании декоратора с моей функцией факториала?
Получение ключа для заданного значения из словаря, состоящего из нескольких массивов