Fix Python – How to enable a virtualenv in a systemd service unit?


Asked By – guettli

I want to “activate” a virtualenv in a systemd service file.

I would like to avoid having a shell process between the systemd process and the python interpreter.

My current solution looks like this:


WorkingDirectory={{ venv_home }}
ExecStart={{ venv_home }}/fooservice --serve-in-foreground



PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin
PYTHONPATH={{ venv_home }}/...
VIRTUAL_ENV={{ venv_home }}

But I am having trouble. I get ImportErrors since some entries in sys.path are missing.

Now we will see solution for issue: How to enable a virtualenv in a systemd service unit?


The virtualenv is “baked into the Python interpreter in the virtualenv”. This means you can launch python or console_scripts directly in that virtualenv and don’t need to activate the virtualenv first or manage PATH yourself.:

ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground


ExecStart={{ venv_home }}/bin/python {{ venv_home }}/ --serve-in-foreground

and remove the EnvironmentFile entry.

To verify that it is indeed correct you can check sys.path by running

{{ venv_home }}/bin/python -m site

and comparing the output to

python -m site

This question is answered By – Nils Werner

This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0