Разделить пакет python на несколько файлов - PullRequest
0 голосов
/ 05 апреля 2020

Настройка проблемы

.
└── my_app
    ├── main.py
    └── my_package
        ├── __init__.py
        ├── foo_file.py
        └── foobar_file.py

с файлами, содержащими следующее:

my_app/main.py:

import my_package
print(f'foobar_var is {my_package.foobar_var}')

my_app/__init__.py:

from .foobar_file import foobar_var

my_app/my_package/foo_file.py:

foo_var='foo'

my_app/my_package/foobar_file.py

foo_var = 'foo'
foobar_var=foo_var + 'bar'

При запуске python3 my_app/main.py я получаю ожидаемый результат:

foobar_var is foobar

Вы можете воссоздать эту рабочую ситуацию с помощью следующей оболочки:

mkdir -p my_app my_app/my_package
echo "import my_package\nprint(f'foobar_var is {my_package.foobar_var}')" > my_app/main.py
echo "foo_var = 'foo'" > my_app/my_package/foo_file.py
echo "foo_var = 'foo'\nfoobar_var=foo_var + 'bar'" > my_app/my_package/foobar_file.py
echo "from .foobar_file import foobar_var" > my_app/my_package/__init__.py

Что я хочу

Теперь вместо определения foo_var в foobar_file.py Я бы хотел импортировать его из foo_file.py. Поскольку это учебный проект для меня, я хотел бы сделать его наиболее pythoni c, элегантным и перспективным способом, насколько это возможно.

Что я пробовал

Я пробовал несколько вещей (и не удалось), в том числе:

из foo_file import foo_var

Изменение my_app/my_package/foobar_file.py на:

from foo_file import foo_var
foobar_var=foo_var + 'bar'

приводит к ошибке:

ModuleNotFoundError: No module named 'foo_file'

от. import foo_var

Изменение my_app/my_package/foobar_file.py на:

from . import foo_var
foobar_var=foo_var + 'bar'

приводит к ошибке:

ImportError: cannot import name 'foo_var' from 'my_package'

Документация

Я прочитал это (очень хорошо написано) статья о модулях и пакетах на реальных python .com. Я все еще не мог сделать это.

...