1. ホーム
  2. python

[解決済み] systemdサービスユニットでvirtualenvを有効にするには?

2022-09-07 07:52:01

質問

systemd サービスファイル内の virtualenv を有効にしたいのですが、どうすればよいでしょうか。

systemd プロセスと python インタープリタの間にシェルプロセスが存在しないようにしたいです。

私の現在の解決策は次のようなものです。

[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 }}

しかし、私は困っています。sys.pathのいくつかのエントリが見つからないので、ImportErrorsを得ます。

どのように解決するのですか?

virtualenvは、"baked into the Python interpreter in the virtualenv"である。これはつまり、起動時に python または console_scripts その仮想環境に直接アクセスできるため、仮想環境の起動や管理は必要ありません。 PATH 自分

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

または

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

を削除してください。 EnvironmentFile を入力します。

本当に正しいかどうかを確認するために、次のことを確認できます。 sys.path 駆けて

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

と比較し、その出力を

python -m site