Неясно, как установить переменную __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