Что не так с этой структурой 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']
Я действительно не могу точно определить, что не так с моей структурой, я занимаюсь этим годами, и сегодня, похоже, ничего не работает.
@ Sergio2405 та же проблема, я бы подумал, что это сработает, потому что это корень проекта, но все та же проблема
Я не могу воспроизвести вашу ошибку, я пробовал на своем ноутбуке с вашей точной структурой и множеством конфигураций и рабочей среды, у меня это работает.
@DorianTurba моя проблема была вызвана проблемой пути python
В вашем файле 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 без везения, но это придется сделать
иногда vscode не обнаруживает папку пакета, поэтому вы можете добавить ее в свой settings.json
"terminal.integrated.env.linux": {
"PYTHONPATH": "${workspaceFolder}/src"
}
попробуй
src.libtwo.world import helloworld