Неясно, как установить переменную __package__

У меня есть проект Django, над которым я работаю уже некоторое время. Я пришел к тому, что мне нужно загрузить значительное количество данных в мою базу данных Postgres. Я выделил новый проект Django с sqlite3 только для того, чтобы проработать код и провести несколько тестов, чтобы убедиться, что все вставлено правильно.

Все казалось прекрасным, пока я не дошел до момента, когда я действительно хотел протестировать скрипт вставки.

ImportError: attempted relative import with no known parent package

Ошибка относится к этой строке в скрипте:

from .models import Statute

На данный момент на нем нет красной волнистой линии. models.py и этот скрипт находятся рядом друг с другом в одном каталоге:

$ tree

└── parsecodetree
    ├── db.sqlite3
    ├── manage.py
    ├── parsecodetree
    │   ├── asgi.py
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── ustitles
        ├── admin.py
        ├── apps.py
        ├── __init__.py
        ├── insert504.py
        ├── insert_script_results
        ├── migrations
        ├── models.py
        ├── t10p1b.html
        ├── tests.py
        └── views.py

Я нашел этот трюк в старом видео Дэвида Бизли:

parsecodetree/ustitles/__init__.py:
from .models import *
print("This is ustitles.__init__")
“This is ustitles.__init__” does not print.

Комментирование или некомментирование 'from .models import *', похоже, не имеет никакого значения.

Как бы то ни было:

/home/malikarumi/Projects/uscode/parsecodetree/parsecodetree/__init__.py:
print("This is parsecodetree.__init__")
"This is parsecodetree.__init__" does print.

Но, очевидно, он также получает ошибку:

This is parsecodetree.__init__
Traceback (most recent call last):
<...snip…>
ModuleNotFoundError: No module named 'parsecodetree.parsecodetree'

Я нашел это на сайте RealPython.com скорее непонятным, чем полезным. Если __init__.py не требуется, почему у меня вообще возникла эта проблема?

https://realpython.com/lessons/package-initialization/

Примечание: Во многих документах по Python говорится, что файл __init__.py должен присутствовать в каталоге пакета при создании пакета. должен присутствовать в каталоге пакета при создании пакета. Это когда-то было правдой. Раньше само наличие __init__.py означало для Python, что определяется пакет. Файл мог содержать код инициализации или даже быть пустым, но он должен был присутствовать. присутствовать.

Начиная с Python 3.3, были введены неявные пакеты пространства имен. Они позволяют создавать пакет без какого-либо __init__.py файла. Конечно, он все равно может присутствовать, если необходима инициализация пакета. необходима. Но больше он не требуется.

Я видел много материала о присвоении переменной __package__. Но куда мне поместить это назначение? Я пробовал настройки. Это не сработало.

Я не понимаю отображение от python "package" к django "Project" BASE_DIR == "Project", но оба также == "package" или "__package__"?

В моей установке и parsecodetree, и ustitles являются "пакетами"? Независимо от того, устанавливаю ли я их как == __package__ или нет? Есть ли у них __init__.py или нет?

В этом посте SO создается впечатление, что каждый каталог нуждается в __init__.py, прямо противоположное уроку RealPython. Это также не похоже на DRY.

Получаются красные волнистые линии:

from ustitles.models import Statute

и отслеживание загрузки:

This is ustitles.__init__
Traceback (most recent call last):
<...snip…>
ModuleNotFoundError: No module named 'parsecodetree.parsecodetree'

Но вы заметили? Теперь печатается "This is ustitles.__init__"!

Вместе с тем, как запустить "-m" с помощью PyCharm "run"? Оказывается, этот вопрос все еще остается открытым: https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003879119-how-to-run-python-m-command-in-pycharm-?page=1#community_comment_5925736517010

Вернуться на верх