Hi everyone,
https://docs.djangoproject.com/en/4.2/ref/django-admin/ claims that
manage.py, django-admin and python -m django are practically
interchangable. However, I noticed that they behave differently when it
comes to the python path (the path you can import modules from). I used
`CMD shell -c 'import sys; print(sys.path[0])' to check each one:
- `manage.py` adds its own location to the python path. That is fine
because `django-admin startproject` puts it right next to the project
directory.
- `django-admin` also adds its own location to the python path. That is
less fine because that is usualy something like /some/venv/bin/, so the
project package is not importable. Simply running `django-admin
runserver --settings=example.settings` fails with `ModuleNotFoundError:
No module named 'example'`.
- `python -m django` uses the current directory, which is slightly less
useful than manage.py, but quite intuitive.
Of course you can circumvent all of this by setting PYTHONPATH explicitly.
I personally was burned by this because I use `pip install -e` to add
the folder containing the project directory to the python path. However,
when switching to PEP 517 based packaging, the behavior changed and some
modules could no longer be imported.
is there any official recommendation about this? My impression was
always that manage.py is meant for development and django-admin is meant
for production. But how are you supposed to set the python path in that
case? Is this assumption even correct? I could not find anything about
it in the docs.
In any case, I think the docs need an update because currently, all
examples use `django-admin`, which does not work out of the box in my
experience.
thanks,
tobias