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:
[Unit] Description=fooservice After=syslog.target network.target [Service] Type=simple User=fooservice WorkingDirectory={{ venv_home }} ExecStart={{ venv_home }}/fooservice --serve-in-foreground Restart=on-abort EnvironmentFile=/etc/sysconfig/fooservice.env [Install] WantedBy=multi-user.target
/etc/sysconfig/fooservice.env
PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin PYTHONIOENCODING=utf-8 PYTHONPATH={{ venv_home }}/... VIRTUAL_ENV={{ venv_home }}
But I am having trouble. I get ImportErrors since some entries in sys.path
are missing.
You generally don't need to know the path to the virtual environment Pipenv creates. To activate the environment, just navigate to your project directory and use pipenv shell to launch a new shell session or use pipenv run <command> to run a command directly.
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
or
ExecStart={{ venv_home }}/bin/python {{ venv_home }}/fooservice.py --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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With