I am aware that there are many questions regarding Django and virtual environments, but I cannot wrap my head around the use of virtual environments with respect to deploying my Django app (locally) via uwsgi/nginx.
My setup includes a virtual environment (with Django and uwsgi), my Django app, nginx and PostgreSQL. The app was created before the virtual environment, and I applied only a single change to manage.py
:
#!/Users/snafu/virtualdjango/bin/python3
When I start up the uwsgi located in the virtual environment (with the appropriate .ini
file), everything works right away, but I wonder why. I did not need to fiddle around with the $PYTHONPATH, or append the site packages directory to the system path in manage.py
, or activate the virtual environment at any point (apart from the initial installation of packages), although the boilerplate comment in manage.py
explicitly mentions an inactive virtual environment as a possible reason for an import error.
CodePudding user response:
Activating a virtual environment does nothing but prepend the virtual environment's bin/
to the $PATH
thus making python
and pip
without explicit paths running from the virtual environment. Everything else related to virtual environments is implemented inside Python — it automatically changes sys.path
and other paths (sys.prefix
, sys.exec_prefix
, etc).
This means that when you run python
with an absolute path from a virtual environment Python automatically activates the virtual environment for this particular Python session. So you don't need to activate the virtual environment explicitly.
There is a minor warning sign on the road though: to run any Python script from a non-activated virtual environment you must set the shebang for all scripts to point to the virtual environment or use sys.executable
. Do not use explicit python
because that could be a different Python from the $PATH
.