У меня есть большой репозиторий с некоторой фиксированной структурой, и я расширил его некоторыми папками и скриптами Python, чтобы добавить к нему дополнительную функциональность в целом. Структура выглядит следующим образом:
- toplevelfolder
- featureA
- someModuleA.py
- __ инициализировать __.py
- featureB
- someModuleB.py
- __ инициализировать __.py
- заявление
- __ инициализировать __.py
- app.py
- featureA
Теперь someModuleA.py
и someModuleB.py
можно вызывать через app.py
, но в то же время их можно вызывать напрямую, однако этот вызов должен исходить из папки верхнего уровня, чтобы относительные пути в файле разрешались правильно, то есть через python ./featureA/someModuleA.py
.
Все это работает хорошо, но теперь мне нужны некоторые определения функций из someModuleB
в someModuleA
, и поэтому я хочу импортировать этот модуль. Я пробовал как абсолютный, так и относительный импорт, но оба терпят неудачу с разными ошибками, абсолютный импорт с
from toplevelfolder.featureA import someModuleA as A
# ModuleNotFoundError: No module named 'toplevelfolder'
и относительный импорт с
from toplevelfolder.featureA import someModuleA as A
# ImportError: attempted relative import with no known parent package
Теперь я вижу, что относительный импорт вызовет проблемы, когда python вызывается из toplevelfolder
, поскольку ..
будет представлять родительский каталог последнего, а не родительский каталог featureA
. Однако я не могу получить первое сообщение об ошибке, тем более что toplevelfolder
должен быть не модулем, а пакетом.
Есть ли другой способ импорта в Python, о котором я не знаю, возможно, без изменения PYTHONPATH или sys.path или чего-то в этом роде?
path/to/pythonX.Y -m toplevelfolder.app
вместоpath/to/pythonX.Y toplevelfolder/app.py
. - person sinoroc   schedule 08.05.2020someModuleA
, а неapp
в папке верхнего уровня. - person Jens Eirik Sæthre   schedule 08.05.2020app
, илиfoo
, илиbar
, не имеет значения. Конечно, вам всегда придется адаптировать приведенные здесь ответы к вашему конкретному варианту использования. В любом случае... Если вы всегда используете абсолютный импорт, это должно работать. Предполагается, что пакеты и модули верхнего уровня действительно находятся либо в текущем рабочем каталоге, либо установлены в пакетах сайта. - person sinoroc   schedule 08.05.2020sys.path
, вы должны попытаться превратить свой проект в устанавливаемый пакет: packaging.python .org/tutorials/packaging-projects - person Arne   schedule 08.05.2020app
находится в папке верхнего уровня, тогда какsomeModuleA
находится в подпапке, но все же файл python в папке (т.е.someModuleA.py
) запускается из папки верхнего уровня, что делает сценарий отличается от того, что описывает ваш ответ. Более того, я думаю, что ясно заявил, что абсолютный импорт не работает в этом конкретном сценарии, когдаsomeModuleA.py
запускается из папки верхнего уровня, а не из папки featureA. Но все равно спасибо :) - person Jens Eirik Sæthre   schedule 09.05.2020