Pythonic способ сделать подкаталоги доступными для других подкаталогов в моем проекте

Как структурировать подкаталоги в проекте python и сделать код доступным для других подкаталогов в рамках того же проекта?

Пример того, что мне кажется трудным:

root/
+--- __init__.py
+--- foo/
     +--- __init__.py
     +--- foo.py
     +--- test/
          +--- foo_test.py

Я пытался использовать относительный импорт (, как это предлагается в этом ответе SO)

In foo_test.py:

#!/usr/bin/python

from ... import foo

Попытка запустить это из командной строки:

$ chmod +x ./foo_test.py
$ ./foo_test.py

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "./foo_test.py", line 3, in <module>
    from ... import foo
ValueError: Attempted relative import in non-package

Вопрос:

Каков питонический способ сделать foo доступным для foo_test и других подкаталогов, которые находятся рядом с foo?


person Steve Lorimer    schedule 26.03.2018    source источник
comment
Все это объясняется в этом вопросе, но, по сути, проблема в том, что у вас не должно быть исполняемого файла в пакете. Пакеты предназначены для использования в качестве библиотек, а не исполняемых программ.   -  person Aran-Fey    schedule 26.03.2018
comment
@ Аран-Фей, спасибо за комментарий! Мой опыт работы с python в лучшем случае рудиментарный - обычно только отдельные скрипты. Я продвигаюсь к чему-то большему, поэтому хочу структурировать свой код в несколько сценариев, разделенных на несколько каталогов и т. д. Некоторые из них будут исполняемыми. Остальные будут библиотеками. Каков питонический способ структурировать мой проект в этом случае?   -  person Steve Lorimer    schedule 26.03.2018
comment
Я действительно не являюсь авторитетом в этой теме, но я думаю, что у вас есть два варианта: 1) Спроектируйте свой пакет как чистую библиотеку и поместите все исполняемые скрипты вне пакета. 2) То, что я сказал ранее, немного вводит в заблуждение: вы можете создать исполняемый пакет, но внутри пакета не может быть исполняемого script. Таким образом, другой вариант — создать пакет для каждой функции и сделать пакеты исполняемыми, добавив __main__.py файл. 3) Загляните в чат python, чтобы спросить экспертов :)   -  person Aran-Fey    schedule 26.03.2018
comment
@Aran-Fey спасибо за вклад, очень признателен   -  person Steve Lorimer    schedule 26.03.2018