Ответ 1
По сути, при непосредственном выполнении script.py
он не знает, что он является частью подмодуля src
, и не знает, где может быть модуль с именем src
. Это имеет место либо в python 2 или 3.
Как вы знаете, Python находит модули на основе содержимого sys.path
. Чтобы импортировать любой модуль, он должен либо находиться в каталоге, указанном в sys.path
, либо в том же каталоге, что и script, который вы используете.
Когда вы говорите python src/scripts/script.py
, sys.path
включает Project/src/scripts/
(потому что там, где script.py
), но не Project
. Поскольку Project
не находится в пути, модули в этом каталоге (src
) не могут быть импортированы.
Чтобы исправить это:
Я предполагаю, что ваш script.py
является точкой входа для вашего модуля src
(например, может быть, это основная программа). Если это правда, то вы можете исправить его, переместив script.py
на тот же уровень, что и src
:
Project
├───.git
├───venv
|───script.py <--- script.py moves up here
└───src
├───__init__.py
└───mymodules
├───__init__.py
├───module1.py
└───module2.py
Таким образом, script.py
может свободно импортировать что-либо в src
, но ничего в src
не может импортировать script.py
.
Если это не так, и script.py
действительно является частью src
, вы можете использовать python -m
аргумент для выполните script.py
как часть модуля src
следующим образом:
$ python -m src.scripts.script
Поскольку вы сказали python, какой модуль вы используете (src
), он будет в пути. Таким образом, script.py
будет знать, что это подмодуль src
, а затем сможет импортировать из src
.
Будьте осторожны в этой ситуации - возможно создать круговой импорт, если что-то в src
импортирует src.scripts.script
.
В качестве альтернативы обеим этим подходам вы можете изменить sys.path
непосредственно в script.py
:
import sys
sys.path.insert(0, '/path/to/Project') # location of src
Пока это работает, это обычно не мое предпочтение. Это требует script.py
, чтобы точно знать, как выкладывается ваш код, и может вызвать замедление импорта, если другая программа python пытается импортировать script.py
.